如何从数据库 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 而 运行 迁移以避免在迁移过程中可能出现的错误,但希望它清楚。
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 而 运行 迁移以避免在迁移过程中可能出现的错误,但希望它清楚。