Je suis curieux de savoir s'il existe un moyen de faire une requête dans Django qui ne soit pas un " SELECT * FROM...
" en dessous. J'essaye 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ù le Rank
est un rang dans a Category
. J'aimerais pouvoir parcourir toutes les catégories en effectuant des opérations sur chaque rang de cette catégorie.
J'aimerais d'abord obtenir une liste de toutes les catégories du système, puis interroger tous les produits de cette catégorie et répéter jusqu'à ce que chaque catégorie soit traitée.
Je préfère éviter le SQL brut, mais si je dois y aller, ce serait bien. Bien que je n'ai jamais codé SQL brut dans Django / Python auparavant.
C'est assez simple en fait si vous utilisez PostgreSQL , utilisez simplement
distinct(columns)
( documentation ).Notez que cette fonctionnalité est incluse dans Django depuis la 1.4
la source
can_distinct_on_fields
qui semble être uniquementall()
n'est pas nécessaire iciLes autres réponses sont correctes, mais c'est un peu plus propre, en ce sens que cela ne donne que les valeurs comme vous obtiendriez d'une requête DISTINCT, sans aucune cruauté de Django.
ou
Et cela fonctionne sans PostgreSQL.
C'est moins efficace que d'utiliser un .distinct (), en supposant que DISTINCT dans votre base de données est plus rapide qu'un python
set
, mais c'est génial pour nouiller autour du shell.la source
values_list
ne met pasDISTINCT
dans la requête SQL, donc cela apporterait plusieurs valeurs s'il y en avait.L'utilisateur commande par avec ce champ, puis fait distinct.
la source