迁移时传递South随机唯一默认值

mzu*_*mzu 12 django django-south

我正在尝试使用现有数据转发模型.该模型有一个新的字段,其约束唯一= True和null = False.当我做

./manage.py schemamigration myapp --auto
Run Code Online (Sandbox Code Playgroud)

South让我通过询问为新字段指定默认值:

Specify a one-off value to use for existing columns now
Run Code Online (Sandbox Code Playgroud)

通常我将其设置为None,但由于此字段必须是唯一的,我想知道是否可以通过以下方式传递South的唯一值:

 >>> import uuid; uuid.uuid1().hex[0:35]
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误信息

! Invalid input: invalid syntax 
Run Code Online (Sandbox Code Playgroud)

在通过命令行迁移时是否可以传递South随机唯一默认值?

谢谢.

Der*_*wok 28

不幸的是,只有datetime模块可用作模式迁移中的一次性值.

但是,您可以通过将其拆分为三次迁移来实现相同的效果:

  • 在没有约束的情况下向模型添加新字段(null = True,unique = False)
  • 使用数据迁移将UUID添加到新字段
  • 在新字段上添加约束(null = False,unique = True)

数据迁移教程:http://south.readthedocs.org/en/0.7.6/tutorial/part3.html#data-migrations


Nou*_*olf 6

在Django 1.7+中,您可以执行以下操作。它首先添加没有索引且没有唯一性的字段。然后,它分配唯一值(我基于它们的名称和您需要创建的使用的Slugify方法),最后再次更改该字段以添加索引和唯一属性。

from django.db import migrations
import re
import django.contrib.postgres.fields
from common.utils import slugify
import django.core.validators


def set_slugs(apps, schema_editor):
    categories = apps.get_model("myapp", "Category").objects.all()
    for category in categories:
        category.slug = slugify(category.name)
        category.save()


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0034_auto_20150906_1936'),
    ]

    operations = [
        migrations.AddField(
            model_name='category',
            name='slug',
            field=models.CharField(max_length=30, validators=[django.core.validators.MinLengthValidator(2), django.core.validators.RegexValidator(re.compile('^[0-9a-z-]+$'), 'Enter a valid slug.', 'invalid')], help_text='Required. 2 to 30 characters and can only contain a-z, 0-9, and the dash (-)', unique=False, db_index=False, null=True),
            preserve_default=False,
        ),
        migrations.RunPython(set_slugs),
        migrations.AlterField(
            model_name='category',
            name='slug',
            field=models.CharField(help_text='Required. 2 to 30 characters and can only contain a-z, 0-9, and the dash (-)', unique=True, max_length=30, db_index=True, validators=[django.core.validators.MinLengthValidator(2), django.core.validators.RegexValidator(re.compile('^[0-9a-z-]+$'), 'Enter a valid slug.', 'invalid')]),
        ),
    ]
Run Code Online (Sandbox Code Playgroud)