Remove duplicates in a Django query

前端 未结 6 1145
北恋
北恋 2020-12-08 06:39

Is there a simple way to remove duplicates in the following basic query:

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

I tried using

6条回答
  •  囚心锁ツ
    2020-12-08 07:04

    This query will not give you duplicates - ie, it will give you all the rows in the database, ordered by email.

    However, I presume what you mean is that you have duplicate data within your database. Adding distinct() here won't help, because even if you have only one field, you also have an automatic id field - so the combination of id+email is not unique.

    Assuming you only need one field, email_address, de-duplicated, you can do this:

    email_list = Email.objects.values_list('email', flat=True).distinct()
    

    However, you should really fix the root problem, and remove the duplicate data from your database.

    Example, deleting duplicate Emails by email field:

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

    Or books by name:

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

提交回复
热议问题