Select DISTINCT des colonnes dans django?
Je suis curieux de savoir si il y a moyen de faire une requête dans Django qui n'est pas un "SELECT * FROM...
" en-dessous. Je suis en train de faire un "SELECT DISTINCT columnName FROM ...
" à la place.
Plus précisément, j'ai un modèle qui ressemble à:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
où la Rank
est un grade à l'intérieur d'un Category
. Je voudrais être en mesure de parcourir toutes les Catégories de faire une opération sur chaque rang dans cette catégorie.
Je voudrais tout d'abord obtenir une liste de toutes les catégories dans le système et une requête pour tous les produits de la catégorie et de la répétition jusqu'à ce que chaque catégorie est traitée.
Je préfère éviter de SQL brut, mais si je dois y aller, ce serait bien. Bien que je n'ai jamais codé SQL brut dans Django/Python avant.
Vous devez vous connecter pour publier un commentaire.
Une manière d'obtenir la liste des différents noms de colonnes de la base de données est d'utiliser
distinct()
en conjonction avecvalues()
.Dans votre cas, vous pouvez effectuer les opérations suivantes pour obtenir les noms des catégories distinctes:
Il ya un couple de choses à retenir ici. Tout d'abord, ce sera le retour d'un
ValuesQuerySet
qui se comporte différemment d'unQuerySet
. Lorsque vous accédez à dire, le premier élément deq
(ci-dessus), vous obtiendrez un dictionnaire, PAS une instance deProductOrder
.Deuxième, ce serait une bonne idée de lire la note d'avertissement dans les docs sur l'utilisation de
distinct()
. L'exemple ci-dessus fonctionne, mais toutes les combinaisons dedistinct()
etvalues()
peut pas.PS: c'est une bonne idée d'utiliser noms minuscules pour les champs d'un modèle. Dans votre cas, cela signifierait la réécriture de votre modèle comme indiqué ci-dessous:
C'est assez simple en fait si vous utilisez PostgreSQL, il suffit d'utiliser
distinct(columns)
.Noter que cette fonctionnalité a été incluse dans Django 1.4 depuis
distinct
ne pas prendre tous les champs comme argument, la documentation montre que et aussi vérifier le code: code.djangoproject.com/browser/django/trunk/django/db/models/...Distinct
n'acceptera pas les noms de colonnes comme arguments.can_distinct_on_fields
qui semble être Postgres-seulementall()
n'est pas nécessaire icicount()
travailler avecdistinct('field')
?Autres réponses sont beaux, mais c'est un peu plus propre, en ce qu'il ne donne que les valeurs comme vous le feriez obtenir à partir d'une requête DISTINCT, sans trucs de Django.
ou
Et il fonctionne sans PostgreSQL.
C'est moins efficace que l'utilisation d'un .distinct(), en supposant que DISTINCTE dans votre base de données est plus rapide qu'un python
set
, mais il est parfait pour noodling autour de la coque.values_list
ne pas mettreDISTINCT
dans la requête sql, donc ce serait mettre plusieurs valeurs si il y en avait.set
est pourUtilisateur commande par avec ce champ, puis effectuez l'distinctes.