0

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

2 回答 2

1

我认为您的错误是由循环导入引起的 - 即models.pyimports spam_analyzer.py,反之亦然,因此 Python 陷入了混乱。但是,对于您发布的代码,无需 import SharedLinkin spam_analyzer,因为您将其作为参数传递(尽管请注意您传递的是实例,而不是类本身,因此您应该真正调用shared_link参数清晰度)。

另一种方法是使该spam_checker函数成为 SharedLink 类的方法,这样您就可以调用self.spam_checker()您的 save() 方法。

于 2009-09-30T07:43:53.297 回答
0

在表单层检查它。当您第一次看到 sharedLink 时,您可能会从表单中的 clean() 例程中调用 spam_checker;然后通过链接将标志传递给模型。

但可能更好,因为您的垃圾邮件检查器正在不断改进,将垃圾邮件检查器实现为模型上的 flag() 方法。因此,该标志将始终使用您最近的 spam_checking 算法。

class SharedLink(models.Model):
    link = models.URLField()

    @property
    def flag(self):
        return spam_check(self.link)
于 2009-09-30T12:44:43.833 回答