Фильтр объекта, в котором запрашиваемое число находится в диапазоне
Допустим, у меня есть модель с 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 столбцы.