2017-02-15 1 views
0

Je souhaite supprimer les doublons d'une requête basée sur un champ. Je ne veux pas seulement avoir les valeurs mais aussi les objets. L'ORM doit faire un choix en fonction de la ligne qui sera supprimée et de celle qui sera conservée.Supprimer un doublon dans une requête basée sur un champ spécifique

Utilisons cet exemple:

name - date - value 
chris - 1/1/2012 - 12 
youssef - 1/02/2015 - 13 
trump - 1/8/2017 - 12 
chris - 1/12/2018 - 21 
trump - 1/03/2019 - 29 

La sortie serait:

name - date - value 
trump - 1/03/2019 - 29 
chris - 1/12/2018 - 21 
youssef - 1/02/2015 - 13 

Fondamentalement, je veux supprimer les doublons en fonction de l'ordre de jour, quelque chose comme (il ne fonctionne pas) :

Table.objects.order_by('-date').distinct('name').order_by('-value') 

L'ORM peut-il gérer cette requête? Ou devrait-il écrire une fonction?

+0

Découvrez [cet article] (http://stackoverflow.com/questions/6648545/django-query-with-distinct-and-order-by). Cela peut donner un aperçu de ce que vous essayez de faire. – Neelik

+0

merci, mais je ne pouvais pas l'utiliser pour résoudre mon problème. –

Répondre

0

Je n'ai trouvé aucune solution utilisant l'ORM.

La seule façon de résoudre mon problème était d'écrire cette fonction:

def remove_duplicate_based_on_date(query): 
    name_visited = [] 
    pk_to_be_deleted = [] 
    for object in query: 
     if not(object.name in name_visited): 
      name_visited += [object.name] 
     else: 
      pk_to_be_deleted += [object.id] 
    return pk_to_be_deleted 

et l'utiliser comme ceci:

base_query = Table.objects.order_by('-created_at') 
pk_to_be_deleted = remove_duplicate_based_on_date(base_query) 
base_query.filter(id__in=pk_to_be_deleted).delete()