Return-Funktion wie ein Feld, auf dem django-Modell
Habe ich ein Modell, das eine Funktion zur Berechnung der Differenz zwischen zwei Feldern
Beispiel:
Class MyModel(models.Model):
fieldA = models.FloatField()
fieldB = models.FloatField()
def delta(self):
return self.fieldA - self.fieldB
Id wie zu verwenden Sie dieses Modell in einer GenericView. Ich kann die delta-Funktion als eine extraContext aber auch id gerne die Summe aller Delta-Ergebnisse in die Vorlage, in diesem Fall habe ich, um ein Aggregat aber wieder da delta ist nicht ein DB-Feld noch ein Modell Feld, das ich verwenden kann es in ein Aggregat-Funktion.
Wie Sie dies erreichen können?
- Alle Antworten sind richtig, Sie alle Ergebnisse in einem Unterschied von zwei float-Felder, aber ich endete mit dem @daniel-Lösung funktionierte es OK.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie es versucht?
Einen Weg, dies zu tun ist, erstellen Sie einen Manager und eine Funktion definiert, mit der raw-SQL-Abfrage. Erstellen Sie das Modell-Objekt anfügen das neue berechnete Feld verweisen, auf die model-Klasse mit sich selbst.Modell
Fast ein copy-paste aus Django-Dokumentation
Dann können wir den manager-Funktion in der extra-Kontext-Wörterbuch der Allgemeinen Sicht. und tun algebraische Operationen, ohne auf die Datenbank unnötig.
Eine bessere Lösung ist, erstellen Sie Ihre eigenen QuerySet-Klasse mit einem benutzerdefinierten Manager. Dies erlaubt eine Kette von filtern und zurück alle berechneten Wert als ein QuerySet-Attribut. Genommen wird fast direkt von dieser snippet
Wie könnte das funktionieren? Die Aggregation erfolgt in der Datenbank, aber deine Berechnung ist natürlich in Python.
Müssen Sie die Summe in Python als auch:
Ok, erstmal dein code sollte sich beanspruchten, da Sie berechnen wollen, delta von jeder Zeile.
Bezüglich Ihrer Frage, es ist nicht möglich, die Anhäufung von einer django-Funktion. Es gibt drei Möglichkeiten, das zu erreichen, was Sie wollen:
Tun die aggregation in Python. Nachteil: lädt alle Daten aus der Datenbank.
Umgehung des Django-ORM, und führen Sie die SQL-Abfrage manuell (dadurch wird der code-Datenbank-spezifisch).
Erstellen Sie ein weiteres Feld in der Datenbank für die delta-und update Sie auf speichern (oder mit einem trigger, wenn Sie wollen, um Datenbank-spezifische).
Für das, was Sie wollen, fügen Sie einfach eine neue Methode, um das Modell und machen die aggregation auf die DB dann berechnen Sie die Differenz zwischen den beiden Summen. Wie diese: