使用UUID pk识别Django中的新模型实例

时间:2015-03-18 16:41:38

标签: django django-models

如果我的模型具有UUID主键并且用户可以在创建时设置该值,那么在save方法中是否有任何方法可以告知实例是新的?< / p>

检查自动分配字段的先前技术:In a django model custom save() method, how should you identify a new object?不起作用。

4 个答案:

答案 0 :(得分:1)

使用self._state.adding。它默认为True,并在保存模型实例或从数据库加载模型实例后将其设置为False

您还应该检查force_insert的{​​{1}}参数。

请注意,如果您尝试通过更改实例save并保存(常用快捷方式)来复制实例,则此方法将无效。如果需要检测到这一点,可以覆盖实例的保存和加载,以将id存储在pk上,然后将当前的self._statepk进行比较。

答案 1 :(得分:0)

您可以使用django-model-utils TimeStampedModel(您也可以使用django-extensions TimeStampedModel或制作自己的。)

这为每个模型提供了createdmodified字段。然后,将新实例的createdmodified字段之间的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