Операторы Django range и SQL BETWEEN в Python
В этом уроке вы узнаете, как использовать оператор Django range в Python для проверки того, находится ли значение между двумя значениями.
- Что такое оператор SQL BETWEEN?
- Использование range Django с числами
- Использование диапазона Django с датами
- NOT BETWEEN
Что такое оператор 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)