我需要一些关于如何在django模型上处理保存功能的清晰思考。正如你在下面看到的那样,我对如何优雅地做到这一点感到茫然。我想将整个对象传递给另一个模块并在那里进行分析。我将分析打破而不是在models.py中的动机是我会经常改进分析位。感谢。
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
答案 0 :(得分:1)
我认为你的错误是由循环导入引起的 - 即models.py
导入spam_analyzer.py
,反之亦然,因此Python陷入混乱。但是,使用您发布的代码,无需在SharedLink
中导入spam_analyzer
,因为您将其作为参数传递(尽管请注意您传递的是实例,而不是类本身,因此,为了清楚起见,您应该真正调用参数shared_link
。
另一种方法是将spam_checker
函数作为SharedLink类的方法,这样您就可以在save()方法中调用self.spam_checker()
。
答案 1 :(得分:0)
在表单层检查它。当您第一次看到sharedLink时,可以从表单中的clean()例程调用spam_checker;然后将标志传递给带有链接的模型。
但可能更好,鉴于您的垃圾邮件检查程序不断改进,请在模型上将spamchecker实现为flag()方法。因此,该标志将始终使用您最新的spam_checking算法。
class SharedLink(models.Model):
link = models.URLField()
@property
def flag(self):
return spam_check(self.link)