Как получить все дублирующиеся записи в django?
У меня есть модель, которая содержит различные поля, такие как имя, start_time, start_date. Я хочу создать API, который считывает мою модель и отображает все дублирующиеся записи.
Насколько я знаю, это нужно делать в два этапа. Вы находите поля, в которых есть дубликаты, в одном запросе, а затем собираете все эти объекты во втором запросе.
from django.db.models import Count
duplicates = MyModel.objects.values('name') \
.annotate(name_count=Count('id')) \
.filter(name_count__gt=1)
duplicate_objects = MyModel.objects.filter(name__in=[item['name'] for item in duplicates])
duplicates
будет содержать имена, имеющие более одного появления, а duplicate_objects
будет содержать все дублирующие именованные объекты.
Вышеприведенный ответ работает, но я просто хочу опубликовать свой код, чтобы другим новичкам не пришлось искать другие ответы.
from django.db.models import Count
def find_duplicates(request):
if request.method == 'GET':
duplicates = Model.objects.values('field1', 'field2', 'field3')\
.annotate(field1_count=Count('field1'),
field2_count=Count('field2'),
field3_count=Count('field3')
) \
.filter(field1_count__gt=1,
field2_count__gt=1,
field3_count__gt=1
)
duplicate_objects = Model.objects.filter(field1__in=[item['field1'] for item in duplicates],
field2__in=[item['field2'] for item in duplicates],
field3__in=[item['field3'] for item in duplicates],
)
serializer = ModelSerializer(duplicate_objects, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
P.S. поле1 является внешним ключом, поэтому я извлекаю id здесь.