Django 1.11.20 получает количество строк за неделю и год ISO

Мне нужно получить количество элементов в неделю и год ISO. Я попробовал следующее

    from django.db.models.functions import ExtractWeek, ExtractYear
    from django.db.models.aggregates import Count

    count = myModel.objects.annotate(year=ExtractYear('created_at')) \
        .annotate(week=ExtractWeek('created_at')) \
        .values('year','week') \
        .annotate(count=Count('week'))

Но мой результат -

<QuerySet [{'year': 2019, 'week': 7, 'count': 1}, {'year': 2019, 'week': 7, 'count': 1}, {'year': 2019, 'week': 7, 'count': 1}, {'year': 2019, 'week': 7, 'count': 1}.......

Как я могу изменить его, чтобы мой результат:

заранее

0
задан 20.02.2019, 18:49

3 ответа

Проблема заключалась не в пропущенном order_by, а, скорее всего, в обратном: значение по умолчанию order_by предположительно присутствует в myModel посредством поля ordering, определяющего сортировку по умолчанию, которое добавило другое поле в запрос, который саботировал ваша группировка. Соответствующий документ Django здесь здесь .

Вы можете избавиться от него, добавив .order_by() к запросу, или вы можете указать другой порядок, как вы сделали в своем ответе.

Это загвоздка, которая заставляет людей снова и снова (включая меня), поэтому я предпочитаю не использовать сортировку по умолчанию в моделях.

PS: Когда дела идут не по плану, часто помогает проверить сгенерированный SQL, проверяя последний выполненный запрос:

django.db.connection.queries[-1]

... или запрашивая SQL запрос, который вы только что определили:

str(my_query.query)

И если вам нравится то, что вы видите, но вам не нравится, как SQL форматируется (не), изучите sqlparse . [1114 ]

0
ответ дан 21.05.2019, 02:31
  • 1
    можно использовать ancestor и доступ, довольно использующий parent/parent. Вот обновление xpath для Вашей ссылки. //h5[normalize-space(.)='Header Unique Text']/ancestor::div[@class='ibox float-e-margins']/div[@class='ibox-content']/div – supputuri 15.03.2019, 02:00

Вы можете использовать TruncWeek и TruncYear:

from django.db.models.functions import TruncWeek, TruncYear

count_for_week = myModel.objects.annotate(
    week=TruncWeek('created_at'),
).values(
    'week',
).annotate(
    count=Count('id'),
)

count_for_year = myModel.objects.annotate(
    year=TruncYear('created_at'),
).values(
    'year',
).annotate(
    count=Count('id'),
)

В результате вы получите:

 <QuerySet [{'week': datetime.datetime(2019, 2, 18, 0, 0, tzinfo=<UTC>), 'count': 1}]>

Где значения week или year будут дата начала времени для этого диапазона: неделя года

Более подробно вы можете прочитать в Django docs здесь .

0
ответ дан 21.05.2019, 02:31
  • 1
    Я попробовал Ваше решение, но я продолжаю добираться {' week': datetime.datetime (2017, 1, 1, 0, 0, tzinfo =< UTC>), ' count': 1} в моем результате. Количество doesn' t выходят за предел 1 – Willette Lynch 20.02.2019, 19:47
  • 2
    Хороший @supputuri, обновил ответ – Fenio 15.03.2019, 19:09

Я разобрался, я забыл заказать результат

from django.db.models.functions import ExtractWeek, ExtractYear
from django.db.models.aggregates import Count

count = myModel.objects.annotate(year=ExtractYear('created_at')) \
    .annotate(week=ExtractWeek('created_at')) \
    .values('year','week') \
    .annotate(count=Count('id')).order_by('count')

<QuerySet [{'year': 2019, 'week': 7, 'count': 8}]>
0
ответ дан 21.05.2019, 02:31
  • 1
    Ясно. Я заставил его работать теперь! Большое спасибо! – nelaaam 15.03.2019, 00:56

Теги

Похожие вопросы