Как получить все дублирующиеся записи в 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 здесь.

Вернуться на верх