2009-09-30 141 views
0

我需要一些清晰的思考如何处理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 
+0

罗斯曼先生和米先生的答案都可能是正确的。我最终不是以模型或形式来做,而是在视图中。 通过硬币翻转我给罗斯曼先生的答案。他还提到了关于通告的正确信息。 – user140314 2009-09-30 19:51:41

回答

1

我相信你的错误是由一个圆形的进口造成的 - 也就是说,models.py进口spam_analyzer.py,反之亦然,所以Python进入一个混乱。然而,对于您发布的代码,您不需要在spam_analyzer中导入SharedLink,因为您将其作为参数传入(尽管请注意,您传递的是实例,而不是类本身,因此您应该真的调用参数shared_link为清楚起见)。

另一种方法是使spam_checker函数成为SharedLink类的一个方法,因此您可以在save()方法中调用self.spam_checker()

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) 
相关问题