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 № 1Presumo che il tuo errore sia causato da un'importazione circolare, ovvero models.py
importazioni spam_analyzer.py
e 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)