Удалить дубликаты в запросе django
Есть ли простой способ удалить дубликаты в следующем базовом запросе -
email_list = Emails.objects.order_by('email')
Я попытался использовать duplicate(), но он не работал. Не могли бы вы показать мне точный синтаксис для этого запроса без дубликатов? Спасибо.
Ответы
Ответ 1
Этот запрос не даст вам дубликатов, т.е. он предоставит вам все строки в базе данных, упорядоченные по электронной почте.
Однако я предполагаю, что вы имеете в виду, что у вас есть дубликаты данных в вашей базе данных. Добавление distinct()
здесь не поможет, потому что даже если у вас есть только одно поле, у вас также есть автоматическое поле id
, поэтому комбинация id + email не уникальна.
Предполагая, что вам нужно только одно поле, email_address
, de-duplicated, вы можете сделать это:
email_list = Email.objects.values_list('email', flat=True).distinct()
Однако вы действительно должны устранить проблему с корнем и удалить дубликаты данных из своей базы данных.
Пример, удаление дубликатов писем по электронной почте:
for email in Email.objects.values_list('email', flat=True).distinct():
Email.objects.filter(pk__in=Email.objects.filter(email=email).values_list('id', flat=True)[1:]).delete()
Или книги по имени:
for name in Book.objects.values_list('name', flat=True).distinct():
Book.objects.filter(pk__in=Artwork.objects.filter(name=name).values_list('id', flat=True)[3:]).delete()
Ответ 2
Вы можете связать .distinct()
в конце вашего запроса, чтобы фильтровать дубликаты. Отъезд: http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
Ответ 3
Возможно, вы сможете использовать функцию distinct()
, в зависимости от вашей модели. Если вы хотите получить только одну форму формы, вы можете сделать что-то вроде:
email_list = Emails.objects.values_list('email').order_by('email').distinct()
который должен предоставить вам упорядоченный список писем.
Ответ 4
Для проверки дубликата вы можете сделать GROUP_BY
и HAVING
в Django
, как показано ниже. Мы используем Django annotations
здесь.
from django.db.models import Count
from app.models import Email
duplicate_emails = Email.objects.values('email').annotate(email_count=Count('email')).filter(email_count__gt=1)
Теперь перейдем к приведенным выше данным и удалим все остальные emails
за исключением первого (зависит от потребности или чего-то еще).
for data in duplicates_emails:
email = data['email']
Email.objects.filter(email=email).order_by('pk')[1:].delete()
Ответ 5
Я использовал следующее, чтобы фактически удалить дубликаты записей из базы данных, надеюсь, это поможет кому-то еще.
adds = Address.objects.all()
d = adds.distinct('latitude', 'longitude')
for address in adds:
if i not in d:
address.delete()
Ответ 6
Вы также можете использовать set()
email_list = set(Emails.objects.values_list('email', flat=True))