Python 将现有数据库的模型slug字段迁移到unique
在旧数据库中,slug字段不是唯一的,所以会创建重复项。现在我想迁移slug field unique=TruePython 将现有数据库的模型slug字段迁移到unique,python,django,django-models,django-migrations,Python,Django,Django Models,Django Migrations,在旧数据库中,slug字段不是唯一的,所以会创建重复项。现在我想迁移slug field 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
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\u id
,以使该slug唯一
上述问题是否有简单的解决方案使用以下
RunPython
操作更新迁移可能就足够了。下面是推理和更多的例子
您的_new_migration.py
您使用的是哪个版本的django/south?@tutudaju使用的是django 1.8,谢谢,它工作得非常好。要在上述代码中仅更新重复的slug,请使用dupe_slug=SomeModel.objects.values('slug').annotate(Count('slug')).order_by().filter(slug_Count_ugt=1)dup_objects=SomeModel.objects.filter(slug_uin=[item['slug']表示dupe_slug中的item]),而不是更改所有对象。
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),
# ),
]