将模型 slug 字段迁移到现有数据库的唯一字段
migrate model slug field to unique for existing database
在旧数据库中,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 唯一。
以上问题有什么简单的解决方法
使用以下 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 字段不是唯一的,因此会创建重复项。现在我想迁移 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 唯一。
以上问题有什么简单的解决方法
使用以下 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),
# ),
]