Django 5 для начинающих

Прогресс по курсу:  9/1004

3.7 Django ORM, поисковые поля и агрегатные функции
4 из 16 шагов пройдено
0 из 60 баллов  получено

 gt, gte, lt, lte

В Django для выполнения сравнений в запросах к базе данных используются следующие фильтры набора запросов:

  1. gt(больше чем): Этот фильтр выбирает объекты, в которых указанное поле больше заданного значения. Например:
    Worker.objects.filter(age__gt=35)

    Этот запрос извлечет всех сотрудников, возраст которых (поле age) больше 35.

     

  2. lt(меньше чем): этот фильтр выбирает объекты, в которых указанное поле меньше заданного значения. Например:
    Worker.objects.filter(age__lt=30)

    Этот запрос извлечет всех сотрудников, возраст которых (поле age) меньше 30.

     

  3. gte(больше или равно): этот фильтр выбирает объекты, в которых указанное поле больше или равно заданному значению. Например:
    Worker.objects.filter(age__gte=34)

    Этот запрос извлечет всех сотрудников, возраст которых (поле age) больше или равно 34.

     

  4. lte(меньше или равно): Этот фильтр выбирает объекты, в которых указанное поле меньше или равно заданному значению. Например:
    Worker.objects.filter(age__lte=31)

    Этот запрос извлечет всех сотрудников, возраст которых (поле age) меньше или равно 31.

 

 startswith / istartswith

Иногда вам нужно проверить, начинается ли строка с подстроки. Например, вы можете найти сотрудников, чье имя начинается с "J".

Чтобы сделать это в SQL, вы используете LIKE оператор:

SELECT * 
FROM hr_employee
WHERE first_name LIKE 'J%';

Это % подстановочный знак, который соответствует любому количеству символов. И 'J%' соответствует строкам, которые начинаются с J и за которыми следует ноль или более символов.

Чтобы запросить данные из Django с помощью LIKE оператора, вы добавляете startswith к имени поля:

field_name__startswith

Например, следующий метод использует этот filter() метод для поиска сотрудников, чьи имена начинаются с J:

Worker.objects.filter(first_name__startswith='J') 

Если вы хотите найти сотрудников, чьи имена начинаются с J регистра без учета регистра, вы можете использовать istartswith:

Worker.objects.filter(first_name__istartswith='j')

В этом случае __istartswith для сопоставления используется версия значения в верхнем регистре.

 

endswith/iendswith

Оператор endswith и iendswith возвращает QuerySet, если значение заканчивается подстрокой. Эквивалентен endswith следующему LIKE оператору:

LIKE '%substring'

Например, в следующем примере endswith для поиска сотрудников, чьи имена заканчиваются на  en:

Worker.objects.filter(first_name__endswith='en')

Метод iendswith, это нечувствительная к регистру версия метода endswith. Например:

Worker.objects.filter(first_name__iendswith='EN')

 

range()

В SQL вы используете оператор BETWEEN, чтобы проверить, находится ли значение между двумя значениями:

field_name BETWEEN low_value AND high_value

В Django эквивалентом оператора BETWEEN является фильтрация через следующий метод:

Entity.objects.filter(field_name__range=(low_value,high_value))

Например, вы можете найти сотрудников с id от 2 до 4, используя следующий диапазон:

Worker.objects.filter(id__range=(2,4))

За кулисами Django выполняет следующий запрос:

Мы также можем использовать данный метод и с датами, например следующий запрос выведет всех сотрудников, которые были созданы в период между двух дат.

Worker.objects.filter(created__range=('2021-12-12', '2023-12-12')) 

  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Если что у BETWEEN оба значения включены в интервал

@Игорь_Галимов, важное дополнение.

Почему в тексте пишется, что оператор возвращает True, а в скриншотах в выводе QuerySet?

@Aleksandr_Yolshin, исправил, была опечатка.

@Илья_Перминов, также это указано в предыдущем шаге в описании оператора "in".

@Aleksandr_Yolshin, Тоже исправил, спасибо!

При проверке ручками полей "startswith" и "istartswith" может показаться, что различий в работе методов нет: оба не чувствительны к регистру. Так и должно быть для SQLite, поскольку она не поддерживает такое поведение.

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#startswith

Сейм и у "endswith" с "iendswith".