我有一个使用Django ORM的查询:
query_set.annotate( metrics
).annotate(
....blah blah....
).annotate(title=Concat('date__year', Value('*'), 'date__month'))
我希望标题字段类似于一年中的2019-05
或类似的星期几(__week
),例如2019-30
,这意味着2019年的第30周。
答案 0 :(得分:2)
您不能使用此类查询。 Django需要字段名称。但是,我们可以更早地执行提取,例如:
from django.db.models.functions import Concat, ExtractYear, ExtractMonth
query_set.annotate(
dyear=ExtractYear('date'),
dmonth=ExtractMonth('date'),
title=Concat('dyear', Value('*'), 'dmonth')
)
但是请注意,格式不会添加前导零,因此它将是2019-5
,而不是2019-05
。例如,从django-2.1开始,您可以使用LPad
[Django-doc]:
from django.db.models.functions import Concat, ExtractYear, ExtractMonth, LPad
query_set.annotate(
dyear=ExtractYear('date'),
dmonth=LPad(ExtractMonth('date'), 2, Value('0')),
title=Concat('dyear', Value('*'), 'dmonth')
)
但是它当然使它更加复杂。
您也可以提取星期数:
from django.db.models.functions import Concat, ExtractYear, ExtractWeek
query_set.annotate(
dyear=ExtractYear('date'),
dweek=ExtractWeek('date'),
title=Concat('dyear', Value('*'), 'dweek')
)
话虽如此,如果您不打算使用该标题进行过滤,那么最好在Django层进行渲染。 Python具有更好的日期格式工具,此外,通过传输date
对象,您可以进行比较,并使用这些对象进行所有类型的算术运算。数据库的主要任务是有效地存储和检索信息,而不是对该信息进行正确的格式化。