Расширение поиска _range в Django с помощью пользовательского поиска
Я хотел бы расширить функциональность поиска _range
, чтобы значения None
считались бесконечностью.
Вместо того, чтобы только уметь: .filter(created_at_range=[start, end])
Я хочу уметь также
.filter(created_at_nullablerange=[None, end])
,
.filter(created_at_nullablerange=[start, None])
и
.filter(created_at_nullablerange=[None, None])
Насколько я понимаю, в Django можно задать пользовательский поиск:
from django.db.models import Lookup
class Nullablerange(Lookup):
lookup_name = 'nullablerange'
def as_sql(self, qn, connection):
# Actual SQL text must be returned here
Datetime.register_lookup(Nullablerange)
Однако я хотел бы сделать это, наследуя от уже существующего фильтра _range
, поскольку я хотел бы написать как можно меньше пользовательского SQL.
Is this possible?
Do I have better alternatives (custom managers are inappropriate, as I want this to be available for all my models with datetime fields)?
In which .py file should I register my custom lookups so that they're always included?
Обратите внимание, что [None, end]
всегда по умолчанию используется уже существующий поиск _lte
, [start, None]
по умолчанию используется уже существующий поиск _gte
, а [None, None]
просто говорит фильтру ничего не делать.
Все уже есть, поэтому я не чувствую, что мне придется писать пользовательский SQL для этого, но я также не хочу проверять, является ли start
или end
None
каждый раз, когда я фильтрую диапазон дат в своем коде! Это должно управляться только в одном месте.