Question

Je me bats obtenir ma tête autour de ORM du Django. Ce que je veux faire est d'obtenir une liste de valeurs distinctes dans un champ sur ma table .... l'équivalent d'un des éléments suivants:

SELECT DISTINCT myfieldname FROM mytable

(ou en variante)

SELECT myfieldname FROM mytable GROUP BY myfieldname

J'aimerais au moins faire la façon Django avant de recourir à sql brut. Par exemple, avec une table:

  

id, rue, ville

     

1, rue Main, Hull

     

2, Autre Rue, Hull

     

3, Way Bibble, Leicester

     

4, une autre manière, Leicester

     

5, Rue, Londidium

Je voudrais obtenir:

  

Hull, Leicester, Londidium.

Était-ce utile?

La solution

Supposons que votre modèle est 'Shop'

class Shop(models.Model):
    street = models.CharField(max_length=150)
    city = models.CharField(max_length=150)

    # some of your models may have explicit ordering
    class Meta:
        ordering = ('city')

Comme vous pouvez avoir l'ensemble d'attributs de classe Meta de ordering, vous pouvez utiliser order_by() sans paramètres pour effacer toute commande lors de l'utilisation distinct(). Consultez la documentation sous order_by ()

  

Si vous ne voulez pas de commande à appliquer à une requête, pas même la commande par défaut, appelez order_by () sans paramètre.

et distinct() dans la note où il traite des questions avec l'aide distinct() avec la commande.

Pour interroger votre base de données, il vous suffit d'appeler:

models.Shop.objects.order_by().values('city').distinct()

Il renvoie un Dictionnary

ou

models.Shop.objects.order_by().values_list('city').distinct()

Celui-ci renvoie une ValuesListQuerySet que vous pouvez jeter un list. Vous pouvez également ajouter à flat=True values_list pour aplatir les résultats.

Voir aussi: obtenir des valeurs distinctes de queryset par champ

Autres conseils

En plus de la réponse pertinente encore très de jujule, je trouve qu'il est très important d'être aussi conscient des conséquences de order_by() sur les requêtes distinct("field_name"). Ceci est, cependant, une seule caractéristique Postgres!

Si vous utilisez Postgres et si vous définissez un nom de champ que la requête doit être distincte pour, alors order_by() doit commencer par le même nom de domaine (ou les noms de champs) dans la même séquence (il peut y avoir plus de champs par la suite) .

  

Note

     

Lorsque vous spécifiez les noms de champs, vous devez fournir une order_by () dans la   QuerySet et les champs order_by () doivent commencer par les champs   distinct (), dans le même ordre.

     

Par exemple, SELECT DISTINCT ON (a) vous donne la première ligne pour chaque   La valeur dans la colonne a. Si vous ne spécifiez pas de commande, vous aurez quelques-uns   ligne arbitraire.

Si vous voulez envoyer un e-G- extraire une liste des villes que vous connaissez des magasins dans l'exemple de jujule devrait être adaptée à ceci:

# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')  

Par exemple:

# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top