В этом уроке вы узнаете, как использовать оператор Django range в Python для проверки того, находится ли значение между двумя значениями.
Что такое оператор SQL BETWEEN?
В SQL оператор BETWEEN используется для проверки того, находится ли значение между двумя значениями:
field_name BETWEEN low_value AND high_value
Это эквивалентно следующему:
field_name >= low_value AND field_name <= high_value
Оператор BETWEEN возвращает true, если field_name находится между low_value и high_value. В противном случае он возвращает False.
Использование range Django с числами
Эквивалентом оператора BETWEEN в Django является range:
Entity.objects.filter(field_name__range=(low_value,high_value))
Например, вы можете найти сотрудников, чей идентификатор находится в диапазоне от 1 до 5, используя следующий range:
>>> Employee.objects.filter(id__range=(1,5))
За кулисами Django выполняет следующий запрос:
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE "hr_employee"."id" BETWEEN 1 AND 5
Использование диапазона Django с датами
Помимо чисел и строк, диапазон также работает с датами. Например, следующий код возвращает все назначения на работу, начиная с 1 января 2020 года по 31 марта 2020 года:
>>> Assignment.objects.filter(begin_date__range=(start_date,end_date))
SELECT "hr_assignment"."id",
"hr_assignment"."employee_id",
"hr_assignment"."job_id",
"hr_assignment"."begin_date",
"hr_assignment"."end_date"
FROM "hr_assignment"
WHERE "hr_assignment"."begin_date" BETWEEN '2020-01-01'::date AND '2020-03-31'::date
NOT BETWEEN
Оператор NOT отрицает оператор BETWEEN:
field_name NOT BETWEEN(low_value, high_value)
Другими словами, NOT BETWEEN возвращает true, если значение не находится в диапазоне значений. Это эквивалентно следующему:
field_name < low_value OR field_value > high_value
В Django вы можете использовать объект Q с диапазоном, чтобы проверить, находится ли значение вне диапазона:
Entity.objects.filter(~Q(field_name__range=(low_value,high_value)))
Например, вы можете найти сотрудников с идентификатором, не входящим в диапазон(1,5):
>>> Employee.objects.filter(~Q(id__range=(1,5)))
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name",
"hr_employee"."contact_id",
"hr_employee"."department_id"
FROM "hr_employee"
WHERE NOT("hr_employee"."id" BETWEEN 1 AND 5) 