Подтвердить что ты не робот

Удалить дубликаты в запросе django

Есть ли простой способ удалить дубликаты в следующем базовом запросе -

email_list = Emails.objects.order_by('email')

Я попытался использовать duplicate(), но он не работал. Не могли бы вы показать мне точный синтаксис для этого запроса без дубликатов? Спасибо.

4b9b3361

Ответ 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()

Ответ 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))