Фильтр объекта, в котором запрашиваемое число находится в диапазоне

Допустим, у меня есть модель с low и high, образующими диапазон, и я хочу найти экземпляр, если число попадает в этот диапазон.

ID Prefix Low High
3 GH 1 300
4 GH 450 700

Если бы я искал GH250, я бы получил экземпляр с ID 3 в данном примере.

Я рассматривал возможность использования range() для получения списка всех чисел в диапазоне, но это потребует от меня сначала запросить каждый экземпляр с префиксом GH, а затем построить диапазон для каждого & каждого из них, чтобы найти, какой из них перекрывается.

Чтобы ограничить это, у меня по крайней мере есть low & high, так что я могу запросить все экземпляры с префиксом GH, где high находится под 250, и это несколько уменьшает результаты, но это все равно довольно большой запрос.

Это мой текущий запрос, который просто ищет prefix, являющийся точным & low или high, содержащий число.

prefix = search[:2]
number = search[2:]

queryset = queryset.filter(
                        Q(Q(low__icontains=number) |
                        Q(high__icontains=number)) &
                        Q(prefix__icontains=prefix)
                    )

Какие инструменты могут быть доступны мне для эффективной фильтрации результатов, чтобы получить блок, содержащий искомый номер?

Вы можете фильтровать с помощью:

prefix = search[:2]
number = search[2:]

queryset = queryset.filter(
    prefix=prefix,
    low__lte=number,
    high__gte=number
)

Вы можете повысить эффективность, установив db_index=True [Django-doc] на low и high столбцы.

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