【问题标题】:What is the best way to deal with a django model object?处理 django 模型对象的最佳方法是什么?
【发布时间】:2010-12-02 12:12:17
【问题描述】:

我需要对如何在 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

【问题讨论】:

  • 罗斯曼先生和米先生的答案可能都是正确的。我最终不是在模型或表单中,而是在视图中这样做。通过掷硬币,我将答案交给罗斯曼先生。他还提到了有关循环导入的正确信息。

标签: django model save


【解决方案1】:

我认为您的错误是由循环导入引起的 - 即 models.py 导入 spam_analyzer.py,反之亦然,因此 Python 陷入了混乱。但是,使用您发布的代码,无需在spam_analyzer 中导入SharedLink,因为您将它作为参数传递(尽管请注意您传递的是实例,而不是类本身,所以您真的应该为了清楚起见,调用参数shared_link)。

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

【讨论】:

    【解决方案2】:

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

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

    class SharedLink(models.Model):
        link = models.URLField()
    
        @property
        def flag(self):
            return spam_check(self.link)
    

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 2015-10-15
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2018-03-29
      • 2017-09-14
      相关资源
      最近更新 更多