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



如果我有一个具有UUID主键的模型,并且用户可以在创建时设置值,那么有没有办法在save方法中告知实例是新的?

以前检查自动分配字段的技术:在django模型自定义save()方法中,应该如何识别新对象?不要工作。

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

您还应该检查saveforce_insert参数。

请注意,如果您试图通过更改实例的id并保存(一种常见的快捷方式)来复制实例,则这将不起作用。如果需要检测到这一点,可以覆盖实例保存和加载,将pk也存储在self._state上,然后将当前的pkself._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或自己制作)。

这为每个模型提供了一个createdmodified字段。然后,将新实例的createdmodified字段之间的时间增量与任意时间差进行比较(本例使用5秒)。这允许您识别实例是否为新实例:

def save(self, *args, **kwargs):
    super(<ModelName>, self).save(*args, **kwargs)
    if (self.modified - self.created).seconds < 5:
        <the instance is new>   

最新更新