Django 模型:添加一个带有 unique=True 的新字段并且迁移将失败,因为向现有记录输入相同的值

Ran*_*ang 2 django model

我正在向模型添加一个新字段:

class Abc(models.Model):
    ...
    slug = models.SlugField(unique=True)
Run Code Online (Sandbox Code Playgroud)

在此期间,Makemigrations我一劳永逸地提供了一个空字符串。然后Migrate因为重复的 key 失败了Key (slug)=() is duplicated

以下是我试图解决的问题。makemigrations一切正常,但migrate由于同样的原因失败。

1) 删除unique=True并再次迁移

2)去除slug字段,再次迁移

3)unique=False再次设置迁移

无法删除数据库。我被卡住了,别无选择。有什么建议?

Rod*_*ier 6

您遇到此问题是因为表中至少有两条记录具有相同的 slug。

要解决此问题,您可以执行以下步骤

  1. 创建数据迁移。 ./manage.py makemigrations <app_name> --empty
  2. 在迁移文件中,在文件中添加django迁移的RunPython操作。一个例子类似于下面的片段。

    from __future__ import unicode_literals
    
    from django.db import models, migrations
    from django.utils.text import slugify
    
    def forwards(apps, schema_editor):
        Abc = apps.get_model('app', 'Abc')
        for obj in Abc.objects.all():
            if len(obj.slug) == 0:
                obj.slug = slugify(obj.field1)
                obj.save()
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('app', '0003_Abc'),
        ]
    
        operations = [
            migrations.RunPython(forwards, reverse_code=migrations.RunPython.noop),
        ]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加unique=True到字段。

  4. 创建迁移。 ./manage.py makemigrations <app_name>

  5. 迁移您的数据库。 ./manage.py migrate <app_name>

  • 我终于找到了另一个解决方案:1)。删除失败的迁移文件,保留以前的文件不变,2) 删除 unique=True 3) Makemigrations 和 Migrate。有效。谢谢,罗德。 (2认同)