Расширение поиска _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 каждый раз, когда я фильтрую диапазон дат в своем коде! Это должно управляться только в одном месте.