Вы не можете использовать такие поиски. Джанго ожидает имена полей. Однако мы можем выполнить извлечение раньше, например:
from django.db.models.functions import Concat, <b>ExtractYear, ExtractMonth</b>
query_set.annotate(
<b>dyear=ExtractYear('date')</b>,
<b>dmonth=ExtractMonth('date')</b>,
title=Concat(<b>'dyear'</b>, Value('*'), <b>'dmonth'</b>)
)
Обратите внимание, что при форматировании начальные нули не будут добавлены, поэтому вместо 2019-05
будет 2019-5
. Так как, например, django-2.1 , вы можете использовать LPad
[Django-doc] для этого:
from django.db.models.functions import Concat, ExtractYear, ExtractMonth, <b>LPad</b>
query_set.annotate(
dyear=ExtractYear('date'),
dmonth=<b>LPad(</b>ExtractMonth('date')<b>, 2, Value('0'))</b>,
title=Concat('dyear', Value('*'), 'dmonth')
)
но это, конечно, делает его более сложным.
Вы также можете извлечь номер недели:
from django.db.models.functions import Concat, ExtractYear, <b>ExtractWeek</b>
query_set.annotate(
dyear=ExtractYear('date'),
<b>dweek=ExtractWeek('date')</b>,
title=Concat('dyear', Value('*'), <b>'dweek'</b>)
)
При этом, если вы не планируете выполнять фильтрацию с этим заголовком, может быть лучше сделать часть рендеринга на слое Django. В Python улучшен инструментарий для форматирования даты, кроме того, передавая date
объекты, вы можете проводить сравнения и выполнять с ними все типы арифметики. Основная задача базы данных - эффективно хранить и извлекать информацию, а не правильно ее форматировать.