Операторы Django range и SQL BETWEEN в Python

В этом уроке вы узнаете, как использовать оператор 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)
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *