Как говорит Нед, я не знаю, как это сделать с помощью ORM. Но вы можете использовать БД для ограничения объема работы, которую вы должны выполнять в цикле for в python.
Идея состоит в том, чтобы использовать annotate
Джанго (который в основном работает group_by
), чтобы найти все экземпляры, которые имеют более одной строки с одинаковым my_id
, и обработать их, как предполагает Нед. Затем для остатка (у которого нет дубликатов), вы можете просто взять отдельные строки.
from django.db.models import Count, Q
annotated_qs = MyModel.objects.annotate(num_my_ids=Count('my_id')).order_by('-date')
dupes = annotated_qs.filter(num_my_ids__gt=1)
uniques = annotated_qs.filter(num_my_ids__lte=1)
for dupe in dupes:
... # just keep the most recent, as Ned describes
keep_ids = [keep.id for keep in keeps]
latests = MyModel.objects.filter(Q(id__in=keep_ids) | Q(id__in=uniques))
Если у вас есть только небольшое количество дубликатов, это будет означать, что ваш цикл for будет намного короче за счет дополнительного запроса (чтобы получить дубликаты).