处理django模型对象的最佳方法是什么?

时间:2009-09-30 00:24:54

标签: django model save

我需要一些关于如何在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

2 个答案:

答案 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)