如果我的模型具有UUID
主键并且用户可以在创建时设置该值,那么在save
方法中是否有任何方法可以告知实例是新的?< / p>
检查自动分配字段的先前技术:In a django model custom save() method, how should you identify a new object?不起作用。
答案 0 :(得分:1)
使用self._state.adding
。它默认为True
,并在保存模型实例或从数据库加载模型实例后将其设置为False
。
您还应该检查force_insert
的{{1}}参数。
请注意,如果您尝试通过更改实例save
并保存(常用快捷方式)来复制实例,则此方法将无效。如果需要检测到这一点,可以覆盖实例的保存和加载,以将id
存储在pk
上,然后将当前的self._state
与pk
进行比较。
答案 1 :(得分:0)
您可以使用django-model-utils TimeStampedModel(您也可以使用django-extensions TimeStampedModel或制作自己的。)
这为每个模型提供了created
和modified
字段。然后,将新实例的created
和modified
字段之间的timedelta与任意时间差(本示例使用5秒)进行比较。这允许您识别实例是否是新的:
def save(self, *args, **kwargs):
super(<ModelName>, self).save(*args, **kwargs)
if (self.modified - self.created).seconds < 5:
<the instance is new>
答案 2 :(得分:0)
在save()
中, self.pk为None 与pk(uuid)不起作用,因为它应该具有default = uuid.uuid4
,并且如果将其设置为default = None
主键应该在数据库中具有默认属性作为有效的uuid,因此在UUID字段中使用default = uuid.uuid4
。
说出方法是添加字段created_at
:
created_at = models.DateTimeField(auto_now_add=True)
,在save()
中使用:
if self.created_at is None:
your code here
答案 3 :(得分:-1)
save
采用可选参数force_insert
。将其传递为True将强制Django执行INSERT。请参阅the documentation。