Вы также можете взглянуть на возможности библиотеки Qt
.
Он поддерживает регулярные выражения, а класс QString имеет хорошие методы, например. split()
возвращает QStringList, список строк, полученных путем разделения исходной строки с предоставленным разделителем. Должно быть достаточно для файла csv ..
Чтобы получить столбец с заданным именем заголовка, я использую следующее: c ++ наследование Qt проблема qstring
Вы можете использовать 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 здесь .
Я разобрался, я забыл заказать результат
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}]>
Проблема заключалась не в пропущенном order_by
, а, скорее всего, в обратном: значение по умолчанию order_by
предположительно присутствует в myModel
посредством поля ordering
, определяющего сортировку по умолчанию, которое добавило другое поле в запрос, который саботировал ваша группировка. Соответствующий документ Django здесь здесь .
Вы можете избавиться от него, добавив .order_by()
к запросу, или вы можете указать другой порядок, как вы сделали в своем ответе.
Это загвоздка, которая заставляет людей снова и снова (включая меня), поэтому я предпочитаю не использовать сортировку по умолчанию в моделях.
PS: Когда дела идут не по плану, часто помогает проверить сгенерированный SQL, проверяя последний выполненный запрос:
django.db.connection.queries[-1]
... или запрашивая SQL запрос, который вы только что определили:
str(my_query.query)
И если вам нравится то, что вы видите, но вам не нравится, как SQL форматируется (не), изучите sqlparse . [1114 ]