2009-01-24 4 views
3

Comment puis-je créer un groupe simple par requête dans la version trunk de django?group by in django

je besoin de quelque chose comme

SELECT name 
FROM mytable 
GROUP BY name 

fait ce que je veux faire est d'obtenir simplement toutes les entrées avec des noms distincts.

+0

Le débordement de pile utilise le démarquage pour le formatage, pas BBcode ou quoi que ce soit. Veuillez modifier votre message et utiliser quatre espaces d'indendation pour marquer votre bloc de code. –

+0

duplication possible de [équivalent Django pour compte et groupe par] (http://stackoverflow.com/questions/327807/django-equivalent-for-count-and-group-by) –

Répondre

3

Ajouter .distinct à votre queryset:

Entries.objects.filter(something='xxx').distinct() 
2

cela ne fonctionnera pas parce que chaque ligne ont id unique. Donc, chaque enregistrement est distinct ..

Pour résoudre mon problème je l'ai utilisé

foo = Foo.objects.all() 
foo.query.group_by = ['name'] 

mais ce n'est pas API officielle.

+0

Malheureusement cela ne fonctionne pas dans django 1.2 alpha –

+0

Oui et je trouve cela très ennuyeux aussi. Il y a des occasions où l'ORM crée du SQL sensible mais la seule chose qui n'est pas sensée est 'group_by' et parfois il semble aussi ajouter des champs supplémentaires à group_by en causant encore plus de ravages. Voir mon [django-utilisateurs poster si vous êtes intéressé] (http://groups.google.com/group/django-users/browse_thread/thread/fa68b624dfd95ccb). – Ciantic

12

Si vous avez besoin de tous les noms distincts, il suffit de ceci:

Foo.objects.values('name').distinct() 

Et vous obtiendrez une liste de dictionnaires, chacun avec une clé de nom . Si vous avez besoin d'autres données, ajoutez simplement plus de noms d'attributs en tant que paramètres à l'appel .values ​​(). Bien sûr, si vous ajoutez dans les attributs qui peuvent varier entre les lignes avec le même nom, vous casserez le .distinct().

Cela n'aidera pas si vous souhaitez récupérer des objets de modèle complets. Mais obtenir des noms distincts et obtenir des données complètes sont des objectifs intrinsèquement incompatibles de toute façon; comment savez-vous qui ligne avec un prénom que vous voulez retourner dans son intégralité? Si vous voulez calculer un certain type de données agrégées pour toutes les lignes avec un nom donné, aggregation support a été récemment ajouté au tronc Django et peut prendre soin de cela pour vous.