删除django查询中的重复项

时间:2011-05-04 00:42:24

标签: sql django

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

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

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

7 个答案:

答案 0 :(得分:84)

这个查询不会给你重复 - 也就是说,它会给你数据库中的所有行,通过电子邮件排序。

但是,我认为你的意思是你的数据库中有重复的数据。在此添加distinct()无济于事,因为即使您只有一个字段,您也有一个自动id字段 - 因此ID +电子邮件的组合不是唯一的。

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

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()

答案 1 :(得分:7)

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

答案 2 :(得分:5)

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

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

应该为您提供有序的电子邮件列表。

答案 3 :(得分:4)

要检查重复项,您可以在GROUP_BY中执行HAVINGDjango,如下所示。我们在这里使用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()

答案 4 :(得分:2)

您也可以使用set()

email_list = set(Emails.objects.values_list('email', flat=True))

答案 5 :(得分:0)

我使用以下内容实际从数据库中删除重复的条目,希望这有助于其他人。

adds = Address.objects.all()
d = adds.distinct('latitude', 'longitude')
for address in adds:    
  if i not in d:
    address.delete()

答案 6 :(得分:0)

你可以使用这个原始查询:your_model.objects.raw("select * from appname_Your_model group by column_name")