web-dev-qa-db-fra.com

Django Model - Obtenir une liste de valeurs distincte

J'essaie d'obtenir une liste de clés étrangères distinctes et j'ai écrit ceci:

my_ids = Entity.objects.values('foreign_key').distinct()

Mais je reçois juste une liste de clés étrangères NON DISTINCTES ... Qu'est-ce qui me manque?

Merci!

54
Ron

C'est pour l'astuce! Les deux solutions ne fonctionneront pas à 100% ... mais je les ai en quelque sorte combinées :)

Passer un argument à distinct ne fonctionne pas pour les bases de données MySQL (afaik)

Celui-ci fonctionne et renvoie un seul objet:

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

Mais merci quand même :)

41
Ron

Peut-être voudrez-vous aller avec ceci:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct()
39
Filip Dupanović
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by()

distinct ne fonctionne pas sans ordre par

Tous les champs utilisés dans un appel order_by () sont inclus dans les colonnes SQL SELECT. Cela peut parfois conduire à des résultats inattendus lorsqu'il est utilisé conjointement avec distinct (). Si vous triez par champs à partir d'un modèle associé, ces champs seront ajoutés aux colonnes sélectionnées et ils peuvent faire apparaître des lignes en double autrement distinctes. Étant donné que les colonnes supplémentaires n'apparaissent pas dans les résultats renvoyés (elles ne sont là que pour prendre en charge la commande), il semble parfois que des résultats non distincts soient renvoyés.

De même, si vous utilisez une requête values ​​() pour restreindre les colonnes sélectionnées, les colonnes utilisées dans n'importe quel order_by () (ou classement par défaut du modèle) seront toujours impliquées et peuvent affecter l'unicité des résultats.

La morale ici est que si vous utilisez distinct () soyez prudent lors de la commande par des modèles connexes. De même, lorsque vous utilisez distinct () et values ​​() ensemble, soyez prudent lorsque vous triez par champs ne figurant pas dans l'appel values ​​().

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

23
Sarath Ak
Entity.objects.order_by('foreign_key').distinct('foreign_key')

Si vous les avez déjà sous forme de liste, convertissez-les en set() pour obtenir les valeurs distinctes.

5
Burhan Khalid