首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django 1.8‘默认’选项只执行一次外部函数

Django 1.8‘默认’选项只执行一次外部函数
EN

Stack Overflow用户
提问于 2015-06-18 23:32:14
回答 2查看 368关注 0票数 3

我试图将一个UUID字段添加到现有的表中。我指定了default = uuid.uuid4,但是它似乎并没有为每一行调用uuid.uuid4函数。因此,当我迁移时,我总是会得到重复的uuid错误。

我的Django版本是1.8.2

代码语言:javascript
复制
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),
        ),
    ]

在错误下面:

代码语言:javascript
复制
> >  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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-19 00:15:33

这里有django文档,详细描述了您想要的内容:https://docs.djangoproject.com/en/1.8/howto/writing-migrations/#migrations-that-add-unique-fields

您将需要两个迁移文件。

  1. 首先添加字段,还将unique=True更改为null=True,这样django就不会尝试使用默认值.
  2. 第二,迁移填充了这个领域。

因此,第二次迁移应该如下所示:

代码语言:javascript
复制
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),
    ]
票数 4
EN

Stack Overflow用户

发布于 2015-06-18 23:47:58

为了每次获得一个新值,您需要将默认值设置为可调用,否则,正如您所观察到的,uuid.uuid4将被计算一次,然后每次使用该单个值。

other StackOverflow question and answer演示如何将可调用的值作为默认值传递。

编辑:这个答案只适用于Django 1.7和更低版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30927563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档