如何从数据库 table 中删除重复项,使用 unique=True 和 makemigrations 更改模型?

How to remove duplicates from the database table, alter the model with unique=True and makemigrations?

class CommonInfo(models.Model):
    name = models.CharField(max_length = 100)
    age = models.PositiveIntegerField()
    class Meta:
        abstract=True
        ordering=['name']
class Student(CommonInfo):
    home_group =models.CharField(max_length=5)
    class Meta(CommonInfo.Meta):
        db_table='student_info'

我有一个与现有数据相似的数据库模型。我想在字段名称上添加一个 uique=True 。在将字段名称更改为唯一之前,有什么方法可以删除现有的重复数据吗?

首先检查其他字段是否依赖于该行然后你可以-- 开发时,打开数据库,到table找到行删除。

您可以在迁移中包含删除重复逻辑,例如:

假设您有一个 ExampleModel 和一个 example_field 已经迁移并且有数据,首先,您需要在该字段中包含唯一约束:

class TestModel(models.Model):
    ...
    example_field = models.CharField(max_length=32, unique=True)
    ...

然后使用 makemigrations 迁移到该模型,准备好迁移脚本后,您可以对其进行修改,包括在 之前 [=15] =] 操作,类似于:

...

def remove_duplicates(apps, schema_editor):
    ExampleModel = apps.get_model("example_app", "ExampleModel")
    db_alias = schema_editor.connection.alias

    # Get the unique values for the "example_field"
    unique_value_list = ExampleModel.objects.using(db_alias).values_list('example_field', flat=True).distinct()

    for unique_value in unique_value_list:
        # Get ids for a specific value except the first one
        pks = (
            ExampleModel.objects.using(db_alias)
            .filter(example_field=unique_value)
            .values_list('id', flat=True)[1:]
        )

        # Remove selected ids
        ExampleModel.objects.using(db_alias).filter(id__in=pks).delete()


class Migration(migrations.Migration):
    ...
    operations = [
        migrations.RunPython(remove_duplicates), # Include the remove duplicates operation
        migrations.AlterField(
            ...

现在,您的 migration 应该可以正常工作了。

这是一个非常简单的示例,您可能需要做一些额外的事情,例如锁定 table 而 运行 迁移以避免在迁移过程中可能出现的错误,但希望它清楚。