В одном из отчетов у меня есть необходимость делать разбивку по месяцам.
Реализовано это примерно так:
from django.db import connection
truncate_date = connection.ops.date_trunc_sql('month','accept_date')
qs = orders.extra({'month':truncate_date,})
result_list = qs.values('month').annotate(amount=Sum('amount')
ВНЕЗАПНО появилась необходимость сделать такую же штуку, но уже не помесячно,а понедельно.
Простая замена month на week в date_trunc_sql плодов не принесла, так как week в самой функции не берется
def datetime_trunc_sql(self, lookup_type, field_name, tzname):
if USE_TZ:
field_name = "CONVERT_TZ(%s, 'UTC', %%s)" % field_name
params = [tzname]
else:
params = []
fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape.
format_def = ('0000-', '01', '-01', ' 00:', '00', ':00')
try:
i = fields.index(lookup_type) + 1
except ValueError:
sql = field_name
else:
format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]])
sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
return sql, params
Вопрос - как с минимальными потерями добавить экстра-поле week в запрос или, возможно, есть ORM функция соответствующая?
Очень не хотелось бы делать цикл пересчета средствами python.
Updated 14 Nov. 2015, 13:03 by Ski.