Frage

ich brauche aggregierten Wert von zwei Spalten zu erhalten. Also zunächst mehrere sie zusammen und dann ihren sum() bekommen. Code unten natürlich nicht funktioniert, es nur zur Klarstellung ist.

Ist es irgendwie möglich, oder soll ich roh SQL verwenden?

SomeModel.objects
    .filter(**something)
    .aggregate(Sum('one_column' * 'another_col'))
War es hilfreich?

Lösung

Sie müssen nicht so viel rohe SQL mit extra () .

obj = SomeModel.objects.filter(**something).extra(
    select = {'total': 'SUM(one_column * another_column)'},
)

Andere Tipps

Wie ich hier beantwortet https://stackoverflow.com/a/36024089/4614802 die richtige Lösung ist abhängig von django Version.

  • Für django <1.8 Verwendung .aggregate(Sum('field1', field="field1*field2"))
  • Für django> = 1,8 Verwendung .aggregate(Sum(F('field1')*F('field2'))

Dies ist sparta. Auf diese Weise, wenn Sie es irgendwo in einer Vorlage drucken wollen, müssen Sie etwas verwenden:

{{ queryset.0.total }}

Das wurde richtig beantwortet hier: Django Aggregation: Aufsummierung der Multiplikation zwei Felder

Die Form ist:

agg = Task.objects.all().aggregate(total=Sum('field1', field="field1*field2"))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top