Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

2.5 Методы возвращающие QuerySet
6 из 6 шагов пройдено

intersection()

Использует SQL оператор INTERSECT для возврата общих элементов двух или более QuerySet-ов. Действуют те же ограничения, как и на union().

Ниже, в примере, мы выбрали первым запросом всех сотрудников возрастом более 25 лет и вторым запросом всех сотрудников моложе 70 лет. И в дальнейшем объединили данные запросы через intersection().

e1 = Employee.objects.filter(age__gte=25)
e2 = Employee.objects.filter(age__lte=70)
e2.intersection(e1, e2)

 

difference()

Использует оператор SQL EXCEPT для хранения только элементов, присутствующих в QuerySet. Это метод, который выводит только те данные из первого QuerySet, которых нет во втором QuerySet. Действуют те же ограничения, как и на union().

e1 = Employee.objects.filter(age__gte=25)
e2 = Employee.objects.filter(age__lte=70)
e1.difference(e2)

 

select_related()

В разделе 2.3 "Связь One-To-Many (Один-ко-многим)" мы уже столкнулись с тем, что при присоединении сотрудника к отделу, Django выполняет два запроса. Первый запрос выбирает первого сотрудника, а второй запрос выбирает отдел выбранного сотрудника. Если вы выберете N сотрудников, чтобы отобразить их на веб-странице, вам нужно выполнить N + 1 запрос, чтобы получить как сотрудников, так и их отделы. Первый запрос (1) выбирает N сотрудников, а N запросов выбирает N отделов для каждого сотрудника. Эта проблема известна как проблема запроса N + 1.

Чтобы решить проблему с запросом N + 1, вы можете использовать select_related() метод выбора как сотрудников, так и отделов с помощью одного запроса. Например:

Employee.objects.select_related('department').all()

В этом примере Django выполняет только один запрос, который объединяет таблицы hr_employee и hr_department.

 

prefetch_related()

Данный метод работает так же, как и select_related(), за исключением того, что он будет работать с отношениями many-to-many

Employee.objects.prefetch_related('compensations').all()

 


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