Аннотировать ответ на запрос на основе номера недели - PullRequest
1 голос
/ 20 мая 2019

У меня есть такой запрос с использованием Django ORM:

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

Я ожидаю, что поле заголовка будет похоже на 2019-05 или аналогично номеру недели (__week) года, например 2019-30, что означает 30-ю неделю 2019.

1 Ответ

2 голосов
/ 20 мая 2019

Вы не можете использовать такие поиски. Джанго ожидает имена полей. Однако мы можем выполнить извлечение раньше, например:

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. Так как, например, , вы можете использовать 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 объекты, вы можете проводить сравнения и выполнять с ними все типы арифметики. Основная задача базы данных - эффективно хранить и извлекать информацию, а не правильно ее форматировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...