Как применить __contains к форматированной дате с django ORM? - PullRequest
0 голосов
/ 30 марта 2020

Я хочу реализовать поиск в базе данных, и мне нужно отфильтровать набор запросов по дате, содержащей поисковый запрос. Проблема в том, что пользователи увидят отформатированную дату (например, dd.mm.yyyy) и ожидают, что поиск увидит ее точно так же, но по умолчанию __contains учитывает дату в формате гггг-мм-дд. Как я могу применить фильтр к DateField перед использованием __contains? Мне нужен способ использования django orm, потому что в противном случае он будет слишком длинным (без использования sql).

Я попытался установить DATE_FORMAT = 'd.m.Y' в соответствии с форматом, но это не имеет никакого эффекта (даже установка USE_L10N = False)

Также подумал о создании пользовательского поиска, но не уверен, как его реализовать

Мне нужно применить __contains ко всем полям модели, поэтому я не могу просто переформатировать значение поиска

1 Ответ

1 голос
/ 30 марта 2020

Вы можете аннотировать атрибут даты в CharField и выполнять свой фильтр по аннотированному атрибуту.

from django.db.models import Func, F, Value, CharField 
queryset.annotate(string_date=Func(
                                   F('YOUR_DATE_FIELD'),
                                   Value('YOUR OUTPUT FORMAT'),
                                   output_field=CharField(),
                                   function='to_char')
                  ).filter(string_date__contains=INPUT_DATE)
...