Django Q objects vs python code лучше по производительности?

Что обеспечит лучшую производительность: использование условий фильтрации с помощью Q в django ORM или просто получение нефильтрованных объектов и сравнение в python.

employee_qs = employee.objects.filter(state=States.ACTIVE, topic_assn__topic_id=instance.ss_topic_id).select_related('c_data').filter(
                Q(c_data__is_null=True) | Q(c_budget__gt=F('c_data__budget_spent') + offset_amt))

В/с


employee_qs = employee.objects.filter(state=States.ACTIVE, topic_assn__topic_id=instance.ss_topic_id).select_related('c_data')
for employee in employee_qs:
    if not employee.c_data or float(employee.budget)-employee.c_data.budget_spent > offset_amt:
        #do something...

Какой из этих двух вариантов будет лучше по производительности?

TLDR: Q объекты будут быстрее.

Почему? Фильтрация, выполняемая с помощью объекта Q, будет выполняться на SQL-сервере (либо PostgreSQL, либо MariaDB). Поэтому следует рассмотреть два аспекта:

  • с Q объектами, нефильтрованные данные не будут передаваться из вашей базы данных на ваш django сервер (меньше данных по сети делают все быстрее) ;
  • Q объекты преобразуются в SQL WHERE клаузулу, в зависимости от того, как настроена ваша таблица (например, наличие индексов на столбцах, которые вы фильтруете) SQL сервер будет использовать эти индексы для фильтрации данных, что намного быстрее, чем на стороне сервера. Кроме того, SQL-серверы написаны на языках, которые намного быстрее, чем Python.
  • .
Вернуться на верх