django - 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()
在模型上调用该方法?有一个更好的方法吗?
解决方案
有一些方法可以在不调用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
推荐阅读
- c - 如何修复“I/O 警告:无法加载外部实体“file.xml””?libxml2,macOS
- php - 如何使用数组中的元素在 PHP 中打印文本文件
- c++ - C++中的二维向量数组
- css - 禁用 Material UI 默认样式
- php - 错误计数 php date_diff
- laravel-5 - 我想从控制器中的 ajax 请求到模块中生成具有其值的新列
- android - 如何在“sdk/color.xml”中使用“app/color.xml”中提到的颜色?
- node.js - 我可以在 MongoDB 文档中插入更多数据而不替换现有数据吗?更新函数替换数据
- mysql - 在 VPN 之外连接到 Mysql 的 jdbc
- rust - 有没有办法从 Vec 创建一个 Box
实现了 Read 特征?