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()