2017-03-07 3 views
2

Sortierung habe ich die folgenden zwei Felder in meiner db-Tabelle und Modell (Modellname: Bestellung):django Admin ermöglicht für berechnete Felder

id, branch_id, product_id, cost, quantity, status, ordered_at 

Und ich habe den folgenden Code in meinem OrderModelAdmin:

list_display = (
    'order_number', 
    'branch', 
    'product', 
    'cost', 
    'quantity', 
    'calculated_total', 
    'status', 
    'ordered_at', 
) 

def calculated_total(self, obj): 
    return obj.cost * obj.quantity 
calculated_total.short_description = _('Total') 

Jetzt möchte ich die Sortierung für dieses Feld aktivieren. In Wirklichkeit alles, was ich tun müssen, um eine Spalte in meiner SELECT-Anweisung hinzuzufügen:

SELECT (t.cost * t.quantity) as TOTAL 
ORDER BY TOTAL 

Gibt es eine Weise, die ich eine SQL-Anweisung für die Sortierung in Django Admin anhängen?

Antwort

5

Es ist nicht möglich, nach dem Ergebnis der calculated_total Methode zu bestellen.

Sie können jedoch die Standardreihenfolge für Ihren Modelladministrator festlegen, indem Sie die Methode get_queryset für Ihren Modelladministrator überschreiben, und ordering by an expression, die dasselbe berechnet.

Ein ähnlicher Ansatz besteht darin, das Abfrage-Set mit der Summe annotieren und dann nach diesem Feld sortieren. Angenommen, die Kosten sind DecimalField und die Menge ist IntegerField, müssen Sie ExpressionWrapper verwenden, um das Ausgabefeld festzulegen. Weitere Informationen finden Sie in der Dokumentation unter Using F() with annotations.

Ich glaube nicht, dass es möglich ist, total direkt in list_display zu verwenden. Sie können jedoch Ihre calculated_total-Methode ändern, um auf das mit Anmerkungen versehene Feld zuzugreifen. Wir setzen `calculated_total.admin_order_field = 'total', so dass der Django-Administrator Ihnen erlaubt, nach dieser Spalte zu sortieren, indem Sie darauf klicken.

+0

Ich verwendete Annotation und es funktionierte richtig und es macht Sinn, aber der Code oben benötigt einige Feinabstimmungen. Ich musste 'calculated_total.admin_order_field = 'total' hinzufügen. Realistisch gesehen ist das genau das, wonach ich gesucht habe. So können Sie eine benutzerdefinierte Spalte hinzufügen und dieses Feld basierend auf dieser Spalte sortieren. Vielen Dank! – Gasim

+0

@Gasim guter Punkt! In meiner ursprünglichen Antwort wurde der Abfragesatz standardmäßig nach Gesamt sortiert. Sie müssen 'admin_order_field' einstellen, wenn Sie auf die Spalte klicken möchten, um nach ihr zu sortieren. Ich habe das zur Antwort hinzugefügt. – Alasdair

Verwandte Themen