Django: Groupe par?
-
19-09-2019 - |
Question
Je cherche quelque chose comme ce qui suit:
previous_invoices = Invoice.objects.filter(is_open=False)
.order_by('-created')
.group_by('user')
mais group_by()
n'existe pas ...
trouverait la facture plus récemment fermé pour chaque utilisateur.
La solution
Option 1:
Bien qu'un group_by()
n'existe pas dans Django, vous pouvez essayer de travailler autour de récupérer la facture plus récemment fermé pour chaque utilisateur en utilisant méthode latest()
et filtre pour un utilisateur ainsi:
previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
.latest('created')
Pour les anciennes versions de Django ont été latest()
n'existe pas, la requête ressemblera à ceci:
previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
.order_by('-created')[0]
Option 2:
Si vous voulez absolument créer les effets d'un group_by
, alors vous créez un manuellement un comme indiqué dans la réponse acceptée ici: Django GROUP BY valeur du champ .
Utilisez
.values_list()
avecflat=True
pour obtenir une liste des valeurs existantes dans votre base de données (si vous ne les connaissez pas à l'avance). Utilisez également.distinct()
pour elimintae les valeurs en double que nous ne nous soucions pas pour ceux:value_list = MyModel.objects.values_list( 'interesting_field', flat=True ).distinct()
itérer
value_list
et remplir votre dictionnaire:group_by_value = {} for value in value_list: group_by_value[value] = MyModel.objects.filter(interesting_field=value)
dictionnaire maintenant
group_by_value
contient comme clés les valeurs distinctes dans votreinteresting_field
et que les valeurs des objets QuerySet, chaque contenant les entrées deMyModel
avecinteresting_field=a value from value_list
.
Remarque:
Il existe cette bibliothèque django-groupe par qui prétend ajouter un group_by()
sur Django vous pouvez vouloir vérifier.
Autres conseils
Il y a cette page à partir de 2007 qui piraté à django, mais ce serait sans objet puisque avant 1.1 ne dispose d'une group_by` non documentée de toute façon. Mais ce fil il y a un an semble avoir quelques idées . Essentiellement:
Django ne pas exposer intentionnellement « GROUP BY » ou quelque chose comme ça, en l'ORM. Bien que le fait que nous sommes sur un arrière-plan de stockage relationnel fuites parfois à travers, l'API ORM est assez SQL agnostique. Au lieu de cela, nous exposer des éléments particuliers de fonctionnalité qui se trouvent être mis en œuvre en utilisant « GROUP BY » quand il est transformé en SQL (et pourrait bien être mis en œuvre par une tout autre un ensemble de fées magiques avec backend différent du système de stockage).
Voir aussi les mentions de l'utilisation extra
, et aussi les moyens magiques dans lesquels que peut échouer. Bonne chance.