PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Django:Група заявки по месец

Първо, трябва да създадете функция, която може да извлече месеца вместо вас:

from django.db import models
from django.db.models import Func

class Month(Func):
    function = 'EXTRACT'
    template = '%(function)s(MONTH from %(expressions)s)'
    output_field = models.IntegerField()

След това всичко, което трябва да направите, е

  1. Анотирайте всеки ред с месеца
  2. групирайте резултатите по анотирания месец, като използвате values()
  3. Анотирайте всеки резултат с обобщената сума от общите суми, като използвате Sum()

Важно :ако класът на вашия модел има подреждане по подразбиране, посочено в мета опциите, тогава ще трябва да добавите празен order_by() клауза. Това е заради https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

Полета, които са споменати в order_by() част от набор от заявки (или които се използват при подреждането по подразбиране на модел) се използват при избора на изходни данни, дори ако не са посочени по друг начин в values() обадете се. Тези допълнителни полета се използват за групиране на резултатите „харесвам“ заедно и могат да направят така, че иначе идентичните редове с резултати да изглеждат отделни.

Ако не сте сигурни, можете просто да добавите празния order_by() клауза така или иначе без никакви неблагоприятни последици.

т.е.

from django.db.models import Sum

summary = (Invoice.objects
              .annotate(m=Month('date'))
              .values('m')
              .annotate(total=Sum('total'))
              .order_by())

Вижте пълния смисъл тук:https://gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17

Ако имате нужда от допълнителна информация:

Подробности за създаването на ваши собствени Func класове:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions

Подробности за клаузата values() (обърнете внимание на това как тя взаимодейства с annotate() по отношение на реда на клаузите):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values

редът, в който клаузите annotate() и values() се прилагат към заявка, е важен. Ако клаузата values() предхожда annotate(), анотацията ще бъде изчислена с помощта на групирането, описано от клаузата values().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql - архивиране на база данни и възстановяване на различен собственик?

  2. Случайно премахнати привилегиите на суперпотребител по подразбиране на postgres - мога ли да ги върна?

  3. Postgres - Функция за връщане на пресечната точка на 2 МАССИВА?

  4. Как да коригирам ГРЕШКА:колона c.relhasoids не съществува в Postgres?

  5. Използване на множество PostgreSQL схеми с Rails модели