Django 1.8'默认'选项仅执行一次外部函数

时间:2015-06-18 23:32:14

标签: python django

我正在尝试将UUID字段添加到现有表中。我指定了default = uuid.uuid4但是,Django似乎并没有为每一行调用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.

2 个答案:

答案 0 :(得分:4)

在这里你有django文档描述你想要的东西: https://docs.djangoproject.com/en/1.8/howto/writing-migrations/#migrations-that-add-unique-fields

您需要两个迁移文件。

  1. 第一个添加字段,也将unique = True更改为null = True所以django不会尝试使用默认值...
  2. 第二次迁移填充了该字段。
  3. 所以第二次迁移应该是这样的:

    var FromStart = 0
    document.write("|");
    for (i = 0; i < FromStart; i++) {
        document.write("_");
    }
    document.write("O");
    for (i = 0; i < 30-FromStart; i++) {
        document.write("_");
    }
    document.write("|<br />");
    
    function Left() {
       FromStart += -1;
    document.write("|");
    for (i = 0; i < FromStart; i++) {
        document.write("_");
    }
    document.write("O");
    for (i = 0; i < 30-FromStart; i++) {
        document.write("_");
    }
    document.write("|<br />");
    }
    
    
    function Right() {
    FromStart += 1;
    document.write("|");
    for (i = 0; i < FromStart; i++) {
        document.write("_");
    }
    document.write("O");
    for (i = 0; i < 30-FromStart; i++) {
        document.write("_");
    }
    document.write("|<br />");
    }
    

答案 1 :(得分:1)

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

这个other StackOverflow question and answer显示了如何将callable作为默认值传递。

编辑:此答案仅适用于Django 1.7及更低版本。