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

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

2.9 Q-объекты и F-объекты
2 из 2 шагов пройдено

В Django QuerySet предоставляет мощный способ извлечения, обработки и фильтрации данных из базы данных. Среди различных инструментов, доступных в Django, выражение F выделяется как одна из самых ценных функций.

Этот шаг посвящен изучению выражения F в Django QuerySet, объяснению его назначения и обсуждению сценариев, в которых оно оказывается полезным.

Что такое выражение «F»?

Выражение F в Django представляет собой значение поля модели или вычисленное значение на основе поля модели. Это позволяет вам обращаться к значениям полей и выполнять операции с базой данных, не загружая их в память Python.

Django использует объект F() для создания соответствующего SQL-выражения на уровне базы данных. Этот подход повышает эффективность, позволяя избежать ненужной передачи данных между базой данных и Python, делая ваш код более быстрым и оптимизированным. В Django термины «F-объект» и «F-выражение» часто используются взаимозаменяемо и относятся к одному и тому же понятию. Оба термина относятся к использованию функции F().

Давайте посмотрим на некоторые варианты использования F-выражений.

Увеличение значения поля

У нас есть модель Employee с полем age, и мы хотим увеличить возраст сотрудника на определенное значение.

Без выражения F:

e = Employee.objects.get(id=1)
e.age += 10
e.save()

С выражением F:

from django.db.models import F
Employee.objects.filter(id=2).update(age=F('age') + 10)

Код, использующий выражение F, позволяет избежать извлечения значения «количество» из базы данных в память Python. Он выполняет операцию увеличения непосредственно на уровне базы данных, сокращая количество ненужных обращений к базе данных.

Этот подход более эффективен, особенно при работе с большими наборами данных или одновременными обновлениями.

 

Сочетание «F» с другими методами QuerySet

Выражение F можно комбинировать с другими методами QuerySet, такими как filter()exclude()annotate() и aggregate(), для создания сложных и эффективных запросов. Он позволяет фильтровать данные или манипулировать ими на основе сравнения полей и расчетов.

С помощью данного запроса, мы можем получить сотрудников, возраст которых больше чем отработанное время в 5 раз.

Employee.objects.filter(age__gt=F('work_experience') * 5)

 

Выполнение операций между полями

 Мы также можем использовать несколько полей. Например с помощью следующего запроса мы можем вывести сотрудников, чей возраст (поле age) складывается с опытом работы (поле work_experience), и выводятся только те сотрудники, у кого данное значение больше или равно 50.

Employee.objects.annotate(diff=F('age') + F('work_experience')).filter(diff__gte=50)

 

Выражение F в Django предоставляет ценный инструмент для динамичных и эффективных операций с базой данных. На примерах кода мы увидели, как использовать выражения F для увеличения полей и объединения их с другими методами QuerySet для сложных запросов.

Эффективно используя F выражения, вы можете улучшить функциональность своего приложения Django, повысить производительность и сохранить целостность данных.


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

Спасибо, Илья, хорошая подача материала. Кстати, не покидало ощущение, что некоторые запросы, мне все же проще и быстрее было бы написать при помощи чистого SQL. Это нормальная практика, или долой чистый и грубый SQL, даешь ORM?

По-возможности лучше не использовать sql-запросы, так-как это может привести к появлению уязвимостей. Так-же советую прочитать это: https://django.fun/ru/articles/tutorials/predotvrashenie-sql-inekcij-tochka-zreniya-avtora-django/

Изменен Дмитрий Селезнев

@Илья_Перминов, спасибо.