处理django模型对象的最佳方式是什么?
问题描述:
我需要一些清晰的思考如何处理django模型上的保存功能。正如你在下面看到的,我对如何优雅地做这件事感到不知所措。我想将整个对象传递给另一个模块并在那里分析它。我的动机是分析分析,而不是在models.py中,我会经常改进分析位。谢谢。处理django模型对象的最佳方式是什么?
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
答
我相信你的错误是由一个圆形的进口造成的 - 也就是说,models.py
进口spam_analyzer.py
,反之亦然,所以Python进入一个混乱。然而,对于您发布的代码,您不需要在spam_analyzer
中导入SharedLink
,因为您将其作为参数传入(尽管请注意,您传递的是实例,而不是类本身,因此您应该真的调用参数shared_link
为清楚起见)。
另一种方法是使spam_checker
函数成为SharedLink类的一个方法,因此您可以在save()方法中调用self.spam_checker()
。
答
在表单图层检查它。当你第一次看到sharedLink时,你可以从你的表单中的clean()例程调用spam_checker;然后将该标志传递给具有该链接的模型。
但是,如果您的垃圾邮件检测器持续改进,可能会更好,请在模型上将spamchecker作为flag()方法实施。因此该标志将始终使用最新的spam_checking算法。
class SharedLink(models.Model):
link = models.URLField()
@property
def flag(self):
return spam_check(self.link)
罗斯曼先生和米先生的答案都可能是正确的。我最终不是以模型或形式来做,而是在视图中。 通过硬币翻转我给罗斯曼先生的答案。他还提到了关于通告的正确信息。 – user140314 2009-09-30 19:51:41