我想在保存新记录(而不是更新现有记录)时,在Django模型对象的save()方法中触发一个特殊操作。
是检查(self。id != None)有必要且充分地保证自我记录是新的且没有被更新?有没有可能被忽略的特殊情况?
我想在保存新记录(而不是更新现有记录)时,在Django模型对象的save()方法中触发一个特殊操作。
是检查(self。id != None)有必要且充分地保证自我记录是新的且没有被更新?有没有可能被忽略的特殊情况?
当前回答
自我检查。Id假设Id是模型的主键。更通用的方法是使用pk快捷方式。
Is_new = self。pk为None
其他回答
自我检查。Id假设Id是模型的主键。更通用的方法是使用pk快捷方式。
Is_new = self。pk为None
这是常见的做法。
id将在第一次保存到db时给出
check for self。pk == None不足以确定对象是否将被插入或更新到数据库中。
Django O/RM有一个特别讨厌的hack,基本上就是检查在PK位置是否有东西,如果有就做一个UPDATE,否则就做一个INSERT(如果PK为None,这将被优化为INSERT)。
它必须这样做的原因是允许在创建对象时设置PK。虽然在主键有序列列的地方不常见,但这不适用于其他类型的主键字段。
如果你真的想知道,你必须做O/RM所做的,并在数据库中查找。
当然,在代码中有一个特定的情况,很可能是self。pk == None告诉你所有你需要知道的,但它不是一个通解。
检查自我的另一种方法。我们可以检查self。模型的状态
self._state。添加才是真正的创造
self._state。添加是错误的更新
我是从这一页上得到的
这是否适用于上述所有场景?
if self.pk is not None and <ModelName>.objects.filter(pk=self.pk).exists():
...