Другие варианты поиска полей в Django для DurationFields?
У меня есть динамический интерфейс расширенного поиска, реализованный на Django и javascript, где пользователь выбирает:
- поле,
- компаратор (используя поиск по полю, такой как "iexact", "startswith", "gt", "lte" и т.д.), и
- поисковый термин для любого количества полей в базе данных
В настоящее время для двух имеющихся у нас полей продолжительности (возраст и "время сбора образца (с момента вливания)") пользователь должен ввести поисковый запрос в формате, совместимом с временной дельтой, используемой для запроса к базе данных django, например, d-hh:mm:ss
, чтобы поиск работал правильно.
Мы хотели бы принимать поисковые запросы в тех единицах, в которых данные вводятся в базу данных (возраст в неделях и время сбора в минутах). Конечно, я мог бы написать отдельный код для достижения этой цели, но я хочу, чтобы этот модуль расширенного поиска, который я написал, был общей реализацией, чтобы мы могли применять его в других проектах без изменения кода...
Так, я смотрел в django doc's field lookups, где, похоже, нет поиска для полей длительности, но есть ссылка на документ, который дает советы по написанию пользовательского поиска полей.
Есть несколько способов, о которых я могу подумать, но путь наименьшего сопротивления - это вписаться в текущую парадигму, используя поиск по полю продолжительности, чтобы создать поиск для каждого случая. Например:
- gtmins = больше данного количества минут
- ltmins = меньше данного количества минут
- eqmins = равно этому количеству минут
- gtweeks = больше данного количества недель
- ltweeks = меньше данного количества недель
- eqweeks = равно этому количеству недель
- и т.д.
Их можно использовать следующим образом:
Animal.objects.filter(age__gtweeks=12)
... что позволит вернуть всех животных старше 12 недель.
Дело в том, что это похоже на повторное изобретение колеса. Мне трудно поверить, что такие возможности поиска полей уже не существуют. Я что-то упускаю?
Другой вопрос, который немного более сложный, заключается в том, что во встроенных средствах поиска полей есть способы детализации поля DateField следующим образом:
Для поля DateField можно задать поиск с использованием единиц измерения, например week, где можно сделать что-то вроде:
Entry.objects.filter(pub_date__week__gte=32)
где он получает объекты записи, чья неделя публикации (из 52 недель в году) больше, чем 32-я неделя.
Существует ли аналогичная спецификация единиц измерения для DurationFields? Например, могу ли я сделать:
Animal.objects.filter(age__weeks__gt=12)
?