【问题标题】:migrate model slug field to unique for existing database将模型 slug 字段迁移到现有数据库的唯一字段
【发布时间】:2015-07-13 14:25:33
【问题描述】:

在旧数据库中,slug 字段不是唯一的,因此会创建重复项。现在我想迁移 slug 字段 unique=True。

slug = models.CharField(max_length=255, unique=True)

$ python manage.py migrate

django.db.utils.IntegrityError: (1062, "Duplicate entry 'some-x-slug' for key 'some_model_slug_6c7ae6ae040a5e98_uniq'")

如果 django 检测到重复的 slug,是否可以在迁移时,我想在 slug 字段的末尾添加 object_id,以使该 slug 独一无二。

上面的问题有什么简单的解决办法

【问题讨论】:

  • 你使用的是哪个版本的 django/south?
  • @tutuDajuju 使用 Django 1.8,

标签: python django django-models django-migrations


【解决方案1】:

使用以下RunPython 操作更新您的迁移可能就足够了。关注this Django guide on writing migrations 进行推理和更多示例。

your_new_migration.py

def update_slugs(apps, schema_editor):
    SomeModel = apps.get_model("some_app", "SomeModel")

    for instance in SomeModel.objects.all():
        instance.slug = '%s-%s' % (instance.slug, instance.object_id)
        instance.save()


class Migration(migrations.Migration):

    dependencies = [
        # ... your existing dependencies
    ]

    operations = [
        # add this operation ...
        migrations.RunPython(update_slugs, reverse_code=migrations.RunPython.noop),

        # ... before your original migration, such as:
        # migrations.AlterField(
        #     model_name='somemodel',
        #     name='slug',
        #     field=models.CharField(unique=True),
        # ),
    ]

【讨论】:

  • 谢谢,它运行良好。只更新上面代码中的重复 slug, dupe_slug = SomeModel.objects.values('slug').annotate(Count('slug')).order_by().filter(slug__count__gt=1) dup_objects = SomeModel.objects.filter( slug__in=[item['slug'] for item in dupe_slug]) 而不是更改所有对象 slug 更改 dup_objects 的 slug。
猜你喜欢
  • 2016-10-08
  • 1970-01-01
  • 2015-08-03
  • 2011-10-26
  • 2021-09-23
  • 1970-01-01
  • 2014-11-29
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多