53 votes

Suppression des doublons dans une requête Django

Existe-t-il un moyen simple de supprimer les doublons dans la requête de base suivante :

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

J'ai essayé d'utiliser duplicate() mais cela ne fonctionnait pas. Quelle est la syntaxe exacte pour effectuer cette requête sans doublons ?

3 votes

Lorsqu'il s'agit de rangs multiples, veuillez consulter : stackoverflow.com/questions/13700200/

0 votes

Ce site c'est répondre en résolvant ce qui a été demandé, avec soi-même groupe par en retournant QuerySet.

0voto

Chris Montanaro Points 8704

J'ai utilisé ce qui suit pour supprimer les entrées en double de la base de données. J'espère que cela aidera quelqu'un d'autre.

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

0voto

Raj Kumar Points 1

Vous pouvez utiliser cette requête brute : your_model.objects.raw("select * from appname_Your_model group by column_name")

0voto

rumbarum Points 11

Utilisation, auto 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)
)

Ce queryset sert à faire cette requête.

 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
 )

feuille de chétif

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X