删除Django查询中的重复项

x8goxv8g  于 2023-05-08  发布在  Go
关注(0)|答案(9)|浏览(210)

在下面的基本查询中,有没有一种简单的方法来删除重复项:

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

我试过使用duplicate(),但它不工作。在没有重复项的情况下执行此查询的确切语法是什么?

uurity8g

uurity8g1#

这个查询不会给予你重复的--也就是说,它会给你数据库中的所有行,通过电子邮件排序。
但是,我假设您的意思是您的数据库中有重复的数据。在这里添加distinct()不会有帮助,因为即使您只有一个字段,您也有一个自动的id字段-因此id+email的组合不是唯一的。
假设你只需要一个字段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()
niwlg2el

niwlg2el2#

为了检查重复,您可以在Django中执行GROUP_BYHAVING,如下所示。我们使用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之外的所有其他emails(取决于需求或其他)。

for data in duplicates_emails:
    email = data['email']
    Email.objects.filter(email=email).order_by('pk')[1:].delete()
tgabmvqs

tgabmvqs3#

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

9lowa7mx

9lowa7mx4#

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

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

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

von4xj4u

von4xj4u5#

也可以使用set()

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

ztmd8pv56#

使用,自我queryset.annotate()

from django.db.models import Subquery, OuterRef

email_list = Emails.objects.filter(
    pk__in = Emails.objects.values('emails').distinct().annotate(
        pk = Subquery(
        Emails.objects.filter(
          emails= OuterRef("emails")
        )
        .order_by("pk")
        .values("pk")[:1])
    )
    .values_list("pk", flat=True)
)

这个查询集去做这个查询。

SELECT `email`.`id`,
        `email`.`title`,
        `email`.`body`,
       ...
       ...
  FROM `email`
 WHERE `email`.`id` IN (
        SELECT DISTINCT (
                SELECT U0.`id`
                  FROM `email` U0
                 WHERE U0.`email` = V0.`approval_status`
                 ORDER BY U0.`id` ASC
                 LIMIT 1
               ) AS `pk`
         FROM `agent` V0
 )

便签纸

from django.db.models import Subquery, OuterRef

group_by_duplicate_col_queryset = Models.objects.filter(
    pk__in = Models.objects.values('duplicate_col').distinct().annotate(
        pk = Subquery(
        Models.objects.filter(
          duplicate_col= OuterRef('duplicate_col')
        )
        .order_by("pk")
        .values("pk")[:1])
    )
    .values_list("pk", flat=True)
)
mkshixfv

mkshixfv7#

我使用下面的方法从数据库中删除了重复的条目,希望这能帮助到其他人。

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

ttp71kqs8#

如果你想从查询集中删除重复信息,例如。假设你有一个用户模型,其中包含name、email等字段,你想删除重复的email,你可以简单地编写这个查询

User.objects.all().distinct("email")

它将返回所有唯一的电子邮件。

ldxq2e6h

ldxq2e6h9#

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

相关问题