J'ai du mal à comprendre l'ORM du Django. Ce que je veux faire, c'est obtenir une liste de valeurs distinctes dans un champ de ma table ... l'équivalent de l'un des éléments suivants:
SELECT DISTINCT myfieldname FROM mytable
(Ou bien)
SELECT myfieldname FROM mytable GROUP BY myfieldname
J'aimerais au moins le faire à la manière Django avant de recourir à SQL brut. Par exemple, avec une table:
id, rue, ville
1, rue Main, Hull
2, autre rue, Hull
3, Bibble Way, Leicester
4, une autre façon, Leicester
5, rue principale, Londidium
J'aimerais avoir:
Hull, Leicester, Londidium.
values_list
cela ne renvoie pas réellement une liste. Il renvoie quelque chose comme un jeu de requêtes. J'ai trouvé utile de toujours utiliser list () autour des appels values_list.values_list
renvoie ValuesListQuerySet qui est un itérateur. La diffusion dans la liste peut être pratique, mais peut également affecter les performances lorsque toutes les lignes doivent être évaluées en même temps, en particulier avec de grands ensembles de données.Meta: ordering = ()
"fonctionnalité" de django orm etobjects.distinct()
vs.objects.ordering().distinct()
nous a causé des heures de confusion. Il devrait y avoir un autocollant d'avertissement de sécurité du consommateur sur ce produit;) Nous pouvons instituer une politique d'attribut de commande sans méta pour éviter de se gratter la tête à l'avenir.Meta
classeordering
et résoudre les problèmes avecdistinct
en utilisantorder_by()
sans paramètres. C'est dans la documentation de l'API QuerySet sousorder_by()
" Si vous ne voulez pas qu'un ordre soit appliqué à une requête, pas même l'ordre par défaut, appelezorder_by()
sans paramètres. "En plus de la réponse toujours très pertinente de jujule , je trouve qu'il est assez important d'être également conscient des implications de
order_by()
sur lesdistinct("field_name")
requêtes. Ceci est, cependant, une fonctionnalité uniquement Postgres!Si vous utilisez Postgres et si vous définissez un nom de champ pour lequel la requête doit être distincte, il
order_by()
faut alors commencer par le même nom de champ (ou noms de champ) dans la même séquence (il peut y avoir plus de champs par la suite).Si vous voulez par exemple extraire une liste de villes dans lesquelles vous connaissez des magasins, l'exemple de jujule devrait être adapté à ceci:
la source
Par exemple:
la source