首页 > 解决方案 > Django 模型中的保存方法何时不运行?

问题描述

我有一个覆盖保存方法的 Django 模型,如下所示:

class Log(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    calls_logged = models.IntegerField(default=0)
    texts_logged = models.IntegerField(default=0)

    completed_logs = models.BooleanField(default=False, db_index=True)

    def save(self, *args, **kwargs):
        if self.calls_logged >= 30 and self.texts_logged >= 50:
            self.completed_logs = True
        super().save(*args, **kwargs)

应该发生的是当Agent达到 30 个调用和 50 个文本时,该save()方法应该将completed_logs字段更改为True. 但是,当我最近检查我的数据库时,一位座席接到了 30 多个电话和 50 多个文本,但completed_logs没有标记为已完成。但是,当我从管理员中单击“保存”时,它completed_logs按预期更新了该字段。

所以,我的问题是:有没有时候 Django 不会save()在模型上调用该方法?有一个更好的方法吗?

标签: djangodjango-models

解决方案


有一些方法可以在不调用save方法的情况下更新数据库中的条目。我能想到的一些是:

  • 查询集的update方法
  • 查询集的bulk_create方法
  • 查询集的bulk_update方法

最有可能的情况是您调用了这些方法之一,导致这种情况发生。

最好的办法是不要作为completed_logs一个字段,而是作为一个属性:

class Log(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    calls_logged = models.IntegerField(default=0)
    texts_logged = models.IntegerField(default=0)
    
    @property
    def completed_logs(self):
        return self.calls_logged >= 30 and self.texts_logged >= 50

推荐阅读