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 以删除您的一个迁移中的重复项。

备注:如果您使用 sqlmigrateRunSQL 的优势在于将其 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 查询。不过我觉得这样就够了。