我基本上得到了这个模型(其他领域不包括在内):
class GiftBase(models.Model):
"""
A base class for describing gift type items.
"""
uuid = models.CharField(max_length=32, default=lambda: uuid.uuid4().hex, unique=True)
当我这么做的时候
^{pr2}$我得到这个输出
Running migrations for facebookapp:
- Migrating forwards to 0053_auto__add_field_giftbase_uuid__add_field_purchase_uuid.
> facebookapp:0053_auto__add_field_giftbase_uuid__add_field_purchase_uuid
FATAL ERROR - The following SQL query failed: ALTER TABLE "facebookapp_giftbase" ADD COLUMN "uuid" varchar(32) NOT NULL UNIQUE DEFAULT '8de722a747974db3aab4c1fdaa618f16';
The error was: could not create unique index "facebookapp_giftbase_uuid_key"
DETAIL: Key (uuid)=(8de722a747974db3aab4c1fdaa618f16) is duplicated.
由此,我意识到uuid字段的默认值是预先计算好的,并用于每个新条目,因此它并不是每个对象都唯一的。如何让它单独计算每个对象的值?在
我修好了。我首先用null=True和unique=False创建字段,然后通过编程为uuid字段提供值,然后更改字段使其unique=True,并对其使用create_unique。在
代码如下:
这应该是有效的:
别忘了检查自动生成的迁移。如果仍有硬编码值,请尝试将
get_default_uuid
直接放入迁移文件,然后编辑default
。在如果要将该列添加到已存在的表中,则需要为已存在的行提供值。在
South会要求您提供一次性值,但据我所知,只有
datetime
可用。如果是这样,您可以使用utcnow.strftime
,然后使用uuid4
作为迁移的一部分运行update。在另外,我建议避免将lambdas用于诸如default之类的字段选项,并始终检查自动生成的迁移。在
相关问题 更多 >
编程相关推荐