【发布时间】:2019-08-18 02:56:16
【问题描述】:
我的模型Image 中有一个主键 ID CharField,我想为新创建的对象创建唯一的 ID。我尝试通过覆盖模型的保存方法来实现这一点:
def save(self, *args, **kwargs):
if not self.pk: # is created
self.id = uuid.uuid4().hex
while Image.objects.filter(id=self.id).exists():
self.id = uuid.uuid4().hex
return super().save(*args,**kwargs)
问题是,save() 在我用Image.objects.create() 创建对象时似乎没有被调用,它只有在我用image=Image(...) 创建对象然后调用image.save() 时才被调用。结果,除非指定,否则新创建的对象没有分配 id,这导致 PostgreSQL 抛出 non_unique primary key 错误。
如何确保在调用 Image.objects.create() 时创建唯一 ID?
Django 版本:1.11.3
更新:我意识到被覆盖的 save() 方法也没有被调用。原来问题是我在迁移中调用模型的save 方法。正如this post 中指出的那样,自定义模型方法在迁移中不可用。我必须将模型的保存方法复制到迁移文件中。
【问题讨论】:
-
UUID(通用唯一标识符)的要点是您始终可以假设两个 UUID 是不同的。您最好将
id字段设置为default=uuid.uuid4(uuid4之后没有括号),这将在对象创建时自动发生。 -
我希望 :( 数据库是在我之前设计的,现在很难在不丢失数据的情况下更改主键字段,所以这不是我的选择。
-
docs
To create an object, instantiate it using keyword arguments to the model class, then call save() to save it to the database.所以请说明你为什么这么认为? -
你是模特
pk姓名id吗? -
文档还说
To create and save an object in a single step, use the create() method.所以我希望使用create()会导致问题。此外,代码库很大,并且有不同的方法来创建对象(例如get_or_create())。我不想遍历整个代码库并寻找这些方法来查看它们是使用create()还是save()。
标签: django postgresql