将模型段字段迁移到现有数据库的唯一字段 - python

在旧数据库中,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迁移时是否有可能检测到重复的子弹,我想在该object_id字段的末尾添加slug,以使该子弹唯一。

有没有解决上述问题的简便方法

python大神给出的解决方案

使用以下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),
        # ),
    ]