Расширение поиска _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.

  1. Is this possible?

  2. Do I have better alternatives (custom managers are inappropriate, as I want this to be available for all my models with datetime fields)?

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

Вернуться на верх