如果我有一个具有UUID
主键的模型,并且用户可以在创建时设置值,那么有没有办法在save
方法中告知实例是新的?
以前检查自动分配字段的技术:在django模型自定义save()方法中,应该如何识别新对象?不要工作。
使用self._state.adding
。它默认为True
,并在保存模型实例或从DB加载后设置为False
。
您还应该检查save
的force_insert
参数。
请注意,如果您试图通过更改实例的id
并保存(一种常见的快捷方式)来复制实例,则这将不起作用。如果需要检测到这一点,可以覆盖实例保存和加载,将pk
也存储在self._state
上,然后将当前的pk
与self._state.pk
进行比较。
在save()
中,self.pk为None,pk(uuid)不起作用,因为它应该有default = uuid.uuid4
,如果您将其设置为default = None
,则primarykey应该在DB中具有作为有效uuid的默认属性,因此在uuid字段中设置default = uuid.uuid4
。
esay方法是添加字段created_at
:
created_at = models.DateTimeField(auto_now_add=True)
在save()
中使用:
if self.created_at is None:
your code here
save
采用可选参数force_insert
。将其作为True传递将迫使Django执行INSERT。请参阅文档。
您可以使用django模型utils TimeStampedModel(您也可以使用django扩展TimeStampetModel或自己制作)。
这为每个模型提供了一个created
和modified
字段。然后,将新实例的created
和modified
字段之间的时间增量与任意时间差进行比较(本例使用5秒)。这允许您识别实例是否为新实例:
def save(self, *args, **kwargs):
super(<ModelName>, self).save(*args, **kwargs)
if (self.modified - self.created).seconds < 5:
<the instance is new>