根据周数注释查询响应

时间:2019-05-20 10:35:59

标签: django django-models

我有一个使用Django ORM的查询:

query_set.annotate( metrics
    ).annotate(
        ....blah blah....
    ).annotate(title=Concat('date__year', Value('*'), 'date__month'))

我希望标题字段类似于一年中的2019-05或类似的星期几(__week),例如2019-30,这意味着2019年的第30周。

1 个答案:

答案 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。例如,从开始,您可以使用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对象,您可以进行比较,并使用这些对象进行所有类型的算术运算。数据库的主要任务是有效地存储和检索信息,而不是对该信息进行正确的格式化。