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!

War es hilfreich?

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 .

  
      
  1. Verwenden Sie .values_list() mit flat=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()
    
  2.   
  3. 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)
    
  4.   
     

Jetzt group_by_value Wörterbuch enthält als Schlüssel der unterschiedlichen Werte   in Ihrem interesting_field und als Wert der queryset Objekte, die jeweils   enthält die Einträge von MyModel mit interesting_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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top