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

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

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

filter()

Начнем с самого простого фильтра. Вы можете фильтровать с помощью одного поискового условия:

Employee.objects.filter(first_name='John')

Мы выбрали работников с именем 'John'. А также вы можете фильтровать с несколькими поисковыми условиями:

Employee.objects.filter(last_name='Doe', age='23')

В обоих вышеуказанных случаях Django переводит поисковые условия в предложение SQL WHERE.

Фильтрация по внешним полям:

Мы можем использовать двойное подчеркивание, чтобы использовать столбцы в связанной таблице в нашем запросе.

Employee.objects.filter(last_name='Doe', department__name='IT') 

Мы выбрали всех работников, которые относятся к департаменту IT. При использовании более одного параметра поиска скрытно будет использоваться SQL оператор AND.

Если строка поиска не совпадает, функция filter() вернет пустой QuerySet.

 

exclude()

Можно исключить некоторые результаты из запроса с помощью метода exclude().

Employee.objects.exclude(first_name='John') 

Мы получили всех работников, кроме работников с именем 'John'.

 

annotate()

Аннотации могут быть простыми значениями, ссылкой на поле или агрегированным выражением. Например, давайте воспользуемся агрегатной функцией Django Count для аннотирования нашей модели Employee для указания количества зарплатных программ для каждого работника:

e = Employee.objects.annotate(compensations_count=Count('compensations'))
for i in e:                                                               
    print(i.first_name, i.last_name, i.compensations_count) 

 

alias()

То же, что annotate(), но вместо аннотирования объектов в QuerySet, сохраняет выражение для последующего повторного использования с другими QuerySet методами. Это полезно, когда результат самого выражения не нужен, но он используется для фильтрации, упорядочивания или как часть сложного выражения.

Например, если вы хотите найти работников с 2 и более чем зарплатными программами, вы можете сделать это:

Employee.objects.alias(compensations_count=Count('compensations')).filter(compensations_count__gte=2)

alias()можно использовать вместе с annotate()exclude()filter()order_by()и update().

 

order_by()

Чтобы переопределить порядок сортировки по умолчанию, вы используете order_by() метод QuerySet. В следующем примере используется order_by() для сортировки сотрудников по имени в порядке возрастания:

Employee.objects.order_by('first_name')

Вы также можете использовать order_by() метод для сортировки сотрудника по имени в порядке убывания:

Employee.objects.order_by('-first_name')

Также order_by() позволяет сортировать результаты по нескольким полям. Например, в следующем примере используется для order_by() сортировки сотрудников по имени и фамилии:

Employee.objects.order_by('first_name','last_name')

Чтобы отсортировать случайным образом, вы можете использовать вопросительный знак ?:

Employee.objects.order_by('?')

order_by('?') может быть медленным и ресурсозатратным, в зависимости от используемой базы данных. Выше сгенерированный SQL из PostgreSQL. И вы можете видеть что время выполнения запроса выросла в 2 раза.

Также order_by() может упорядочивать по полю в связанной модели. Синтаксис поля — связанная модель, за которой следуют двойные символы подчеркивания и имя поля:

Entity.objects.order_by(related_model__field_name)

В следующем примере используется order_by() для сортировки сотрудников по названиям их отделов:

Employee.objects.order_by('department__name')

Сгенерированный SQL показывает, что при упорядочении по полю в связанной модели Django использует соединение, которое соединяет таблицу текущей модели Employee с таблицей связанной модели Department.


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