我试图将一个UUID字段添加到现有的表中。我指定了default = uuid.uuid4,但是它似乎并没有为每一行调用uuid.uuid4函数。因此,当我迁移时,我总是会得到重复的uuid错误。
我的Django版本是1.8.2。
from django.db import models, migrations
import uuid
class Migration(migrations.Migration):
dependencies = [
('conv', '0008_video_video_uri'),
]
operations = [
migrations.AddField(
model_name='conversation',
name='channel_id',
field=models.UUIDField(unique=True, default=uuid.uuid4, editable=False),
),
]在错误下面:
> > File "/home/yonk/projects/trailerapp/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py",
> line 64, in execute
> return self.cursor.execute(sql, params) django.db.utils.IntegrityError: could not create unique index
> "conv_conversation_channel_id_68f7d58df7c78d61_uniq" DETAIL: Key
> (channel_id)=(5f512cbe-e514-4bf5-bf5a-3efd1a94e401) is duplicated.发布于 2015-06-19 00:15:33
这里有django文档,详细描述了您想要的内容:https://docs.djangoproject.com/en/1.8/howto/writing-migrations/#migrations-that-add-unique-fields
您将需要两个迁移文件。
因此,第二次迁移应该如下所示:
def gen_uuid(apps, schema_editor):
MyModel = apps.get_model('myapp', 'MyModel')
for row in MyModel.objects.all():
row.uuid = uuid.uuid4()
row.save()
class Migration(migrations.Migration):
dependencies = [
('myapp', '0004_add_uuid_field'),
]
operations = [
# omit reverse_code=... if you don't want the migration to be reversible.
migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
]发布于 2015-06-18 23:47:58
为了每次获得一个新值,您需要将默认值设置为可调用,否则,正如您所观察到的,uuid.uuid4将被计算一次,然后每次使用该单个值。
此other StackOverflow question and answer演示如何将可调用的值作为默认值传递。
编辑:这个答案只适用于Django 1.7和更低版本。
https://stackoverflow.com/questions/30927563
复制相似问题