删除django查询中的重复项

Dav*_*542 35 sql django

是否有一种简单的方法可以删除以下基本查询中的重复项 -

email_list = Emails.objects.order_by('email')
Run Code Online (Sandbox Code Playgroud)

我尝试使用duplicate(),但它无法正常工作.你能告诉我没有重复的查询的确切语法吗?谢谢.

Dan*_*man 94

此查询不会给您重复 - 即,它将为您提供数据库中的所有行,通过电子邮件排序.

但是,我认为你的意思是你的数据库中有重复的数据.在distinct()这里添加也没有用,因为即使你只有一个字段,你也有一个自动id字段 - 所以id + email的组合不是唯一的.

假设您只需要一个字段,email_address重复数据删除,您可以这样做:

email_list = Email.objects.values_list('email', flat=True).distinct()
Run Code Online (Sandbox Code Playgroud)

但是,您应该确实修复根问题,并从数据库中删除重复数据.

例如,通过电子邮件字段删除重复的电子邮件:

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()
Run Code Online (Sandbox Code Playgroud)

或书名:

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()
Run Code Online (Sandbox Code Playgroud)


zee*_*kay 8

您可以.distinct()在查询集的末尾链接以过滤重复项.查看:http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct

  • 你没有理解这个问题。 (2认同)

Par*_*us- 7

对于检查重复,你可以做一个GROUP_BY,并HAVINGDjango下面。我们在annotations这里使用Django 。

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)
Run Code Online (Sandbox Code Playgroud)

现在遍历以上数据并删除emails除第一个数据以外的所有其他数据(取决于需求或其他)。

for data in duplicates_emails:
    email = data['email']
    Email.objects.filter(email=email).order_by('pk')[1:].delete()
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不起作用:无法将“限制”或“偏移”与删除一起使用。用 .first() 替换 [1:] 是有效的。但是,如果 cnt > 2,这只会删除第一个,而不会删除其余的 (2认同)

Mic*_*nor 6

您可以使用此distinct()功能,具体取决于您的型号.如果您只想从模型中检索单个字段,则可以执行以下操作:

email_list = Emails.objects.values_list('email').order_by('email').distinct()
Run Code Online (Sandbox Code Playgroud)

这应该会给你一个有序的电子邮件列表.