Django:如何删除基于 2 列的重复行?
Django: How to delete duplicate rows based on 2 columns?
我在 this answer 中发现我可以使用原始 SQL.
轻松删除 table 中的重复行(基于 N 列的重复)
是否有使用 Django ORM 的等效项?
我在 Django 中发现的唯一内容涉及仅基于 1 列的重复。
注意:我知道在 Django 中有一种方法可以防止将来重复(基于几个字段),使用 unique_together
字段(但我以前不知道)。
谢谢。
您可以在添加唯一性约束的操作之前添加一个 RunSQL
operation
和 SQL 以删除您的一个迁移中的重复项。
备注:如果您使用 sqlmigrate
,RunSQL
的优势在于将其 SQL 包含在生成的迁移 SQL.
中
将另一个答案中的 SQL 直接翻译成 Django ORM:
from django.db.models import Min
# First select the min ids
min_id_objects = MyModel.objects.values('A', 'B').annotate(minid=Min('id'))
min_ids = [obj['minid'] for obj in min_id_objects]
# Now delete
MyModel.objects.exclude(id__in=min_ids).delete()
这将导致 2 个单独的 SQL 查询,而不是另一个答案中提供的嵌套 SQL 查询。不过我觉得这样就够了。
我在 this answer 中发现我可以使用原始 SQL.
轻松删除 table 中的重复行(基于 N 列的重复)是否有使用 Django ORM 的等效项? 我在 Django 中发现的唯一内容涉及仅基于 1 列的重复。
注意:我知道在 Django 中有一种方法可以防止将来重复(基于几个字段),使用 unique_together
字段(但我以前不知道)。
谢谢。
您可以在添加唯一性约束的操作之前添加一个 RunSQL
operation
和 SQL 以删除您的一个迁移中的重复项。
备注:如果您使用 sqlmigrate
,RunSQL
的优势在于将其 SQL 包含在生成的迁移 SQL.
将另一个答案中的 SQL 直接翻译成 Django ORM:
from django.db.models import Min
# First select the min ids
min_id_objects = MyModel.objects.values('A', 'B').annotate(minid=Min('id'))
min_ids = [obj['minid'] for obj in min_id_objects]
# Now delete
MyModel.objects.exclude(id__in=min_ids).delete()
这将导致 2 个单独的 SQL 查询,而不是另一个答案中提供的嵌套 SQL 查询。不过我觉得这样就够了。