/ / Qual è il modo migliore per gestire un oggetto modello django? - Django, modella, salva

Qual è il modo migliore per gestire un oggetto modello django? - Django, modello, salva

Ho bisogno di un pensiero chiaro su come gestire afunzione di salvataggio su un modello django. Come vedrai di seguito, non so come farlo elegantemente. Vorrei passare l'intero oggetto a un altro modulo e analizzarlo lì. La mia motivazione per avere l'analisi suddivisa e non in models.py è che spesso affinerò il bit di analisi. Grazie.

models.py
from test_app.spam_analyzer import spam_checker
class SharedLink(models.Model):
link = models.URLField()
submitters_ip = models.IPAddressField()
flag = models.CharField()
def save(self, *args, **kwargs):
self.flag = spam_checker(self)
super(SharedLink, self).save(*args, **kwargs)

spam_analyzer.py
from test_app.models import SharedLink #this causes a "field not found" error
def spam_checker(SharedLink)
submitters_ip = SharedLink.submitters_ip
# see if this user"s ip appears on a spam list
# if it does flag it "spam"
return flag

risposte:

1 per risposta № 1

Presumo che il tuo errore sia causato da un'importazione circolare, ovvero models.py importazioni spam_analyzer.pye viceversa, quindi Python si confonde. Tuttavia, con il codice che hai pubblicato, non è necessario importarlo SharedLink in spam_analyzer, poiché lo passi come parametro (sebbene noti che stai passando un'istanza, non la classe stessa, quindi dovresti davvero chiamare il parametro shared_link per motivi di chiarezza).

Un'alternativa sarebbe quella di rendere il spam_checker funziona come un metodo della classe SharedLink, quindi puoi semplicemente chiamare self.spam_checker() nel tuo metodo save ().


0 per risposta № 2

Controllalo a livello di modulo. È possibile chiamare spam_checker dalle routine clean () nel modulo quando si visualizza per la prima volta il sharedLink; quindi passa la bandiera al modello con il link.

Ma forse meglio, dato che il tuo spamcheckerè in costante miglioramento, implementare spamchecker come metodo flag () sul modello. Pertanto, il flag utilizzerà sempre il tuo algoritmo spam_checking più recente.

class SharedLink(models.Model):
link = models.URLField()

@property
def flag(self):
return spam_check(self.link)