Django模型中的save方法何时不运行?
我有一个Django模型,它覆盖save方法,如下所示:Django模型中的save方法何时不运行?,django,django-models,Django,Django Models,我有一个Django模型,它覆盖save方法,如下所示: 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.Bool
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)
当代理
达到30个调用和50条文本时,应该使用save()
方法将已完成的日志
字段更改为True
。但当我最近检查我的数据库时,一名代理打了30多个电话,发了50多条短信,但已完成的日志
没有标记为已完成。但是,当我在管理员中单击“保存”时,它按预期更新了completed\u logs
字段
所以,我的问题是:Django有没有在模型上调用
save()
方法?有更好的方法吗?有一些方法可以更新数据库中的条目,而无需调用save
方法。我能想到的有:
- queryset的
方法update
- 查询集的
方法bulk\u create
- 查询集的
方法bulk\u update
已完成的\u日志作为字段,而是作为属性:
类日志(models.Model):
agent=models.ForeignKey(agent,on_delete=models.CASCADE)
调用\u logged=models.IntegerField(默认值=0)
text\u logged=models.IntegerField(默认值=0)
@财产
def已完成的_日志(自我):
返回self.calls\u logged>=30和self.text\u logged>=50
显示调用save()
的位置。我正在使用update
所以可能就是这样!!非常感谢你!我肯定会切换到您指出的属性设置。Django文档中是否有位置指定哪些模型创建/更新操作不会运行save()
方法?@Ryan注意,将其作为属性意味着它不会保存在数据库中(反正不需要存储,可以简单地计算):)。关于知道哪些方法不调用save
,您可以尝试查看,但我想简单地说,所有可以同时更新多个对象的方法都不调用save
。