Django: Gruppe von?
-
19-09-2019 - |
Frage
Ich bin auf der Suche nach etwas wie folgt aus:
previous_invoices = Invoice.objects.filter(is_open=False)
.order_by('-created')
.group_by('user')
aber group_by()
existiert nicht ...
Dies würde die zuletzt geschlossene Rechnung für jeden Benutzer finden.
Die Aggregation API scheint, dass Sie Dinge zu tun zu lassen, wie dies für Zählungen und Summen, aber ich brauche keine Zählung oder die Summe oder irgendetwas, ich will eigentlich die Rechnung Objekte!
Lösung
Option 1:
Obwohl ein group_by()
nicht in Django nicht vorhanden ist, können Sie versuchen, und arbeiten rund um auf die zuletzt geschlossene Rechnung für jeden Benutzer das Abrufen durch die Verwendung von latest()
Verfahren und Filter für einen Benutzer auch:
previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
.latest('created')
Für ältere Versionen von Django latest()
wurden nicht vorhanden ist, wird die Abfrage wie folgt aussehen:
previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
.order_by('-created')[0]
Option 2:
Wenn Sie unbedingt die Auswirkungen eines group_by
erstellen möchten, dann sind Sie ein erstellen eine manuell wie in der akzeptierte Antwort gezeigt hier: Django GROUP BY Feldwert .
Verwenden Sie
.values_list()
mitflat=True
eine Liste der vorhandenen Werte in der Datenbank zu bekommen (wenn man sich vorher nicht kennen). Verwenden Sie auch.distinct()
doppelte Werte elimintae, wie wir für die nicht kümmern:value_list = MyModel.objects.values_list( 'interesting_field', flat=True ).distinct()
Jetzt durchlaufen
value_list
und füllen Sie Ihre Wörterbuch:group_by_value = {} for value in value_list: group_by_value[value] = MyModel.objects.filter(interesting_field=value)
Jetzt
group_by_value
Wörterbuch enthält als Schlüssel der unterschiedlichen Werte in Ihreminteresting_field
und als Wert der queryset Objekte, die jeweils enthält die Einträge vonMyModel
mitinteresting_field=a value from value_list
.
Hinweis:
Es gibt diese Bibliothek django-group-by die Ansprüche in den ein group_by()
auf Django Sie möchten überprüfen.
Andere Tipps
Es gibt diese Seite von 2007 , die es django gehackt, aber die 1.1 seit pre seiner strittig wäre ohnehin einen nicht dokumentiert group_by` hat. Aber diesen Thread von vor einem Jahr scheint einige Einsichten zu haben . Im Wesentlichen:
Django aussetzt absichtlich nicht „GROUP BY“ oder so etwas, in die ORM. Obwohl die Tatsache, dass wir über ein relationales Speicher Backend manchmal leckt durch die API ORM ist ziemlich SQL-Agnostiker. Stattdessen haben wir belichten insbesondere Stücke Funktionalität, die zu passieren mit „GROUP BY“ implementiert, wenn es verwandelte sich in SQL (und könnte gut sein, durch eine ganz andere umgesetzt Satz von magischen Feen mit a verschiedenes Speichersystem Backend).
Siehe auch die Erwähnungen von extra
verwenden, und auch die magischen Art und Weise, in der , die fehlschlagen kann. Viel Glück.