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

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

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

raw()

Если ваш API-интерфейс запроса модели не может выполнить определенные запросы или вы хотите повысить производительность, вы можете использовать необработанные SQL-запросы в Django. ORM(Object Relational Mapper) помогает преодолеть разрыв между базой данных и нашим кодом, выполняя необработанные запросы через метод raw().

Employee.objects.raw('select * FROM hr_employee')

Возвращает объект <RawQuerySet: select * FROM hr_employee>

 

AND (&)

Объединяет два запроса QuerySet с помощью оператора SQL AND аналогично цепочке фильтров. 

Employee.objects.filter(id=1) & Employee.objects.filter(age__gt=0)
Employee.objects.filter(id=1).filter(age__gt=0)

Это два запроса, которые будут эквивалентны друг другу.

 

OR (|)

Объединяет два QuerySet с помощью оператора SQL OR.

Employee.objects.filter(id=1) | Employee.objects.filter(id=2) 

Выполнение SQL:

 

XOR (^)

Объединяет два QuerySet с помощью оператора SQL XOR.

Employee.objects.filter(id=1) ^ Employee.objects.filter(age__gt=2)

 XOR изначально поддерживается в MariaDB и MySQL. В других базах данных преобразуется в эквивалент: x ^ y ^ ... ^ z

(x OR y OR ... OR z) AND
1=(
    (CASE WHEN x THEN 1 ELSE 0 END) +
    (CASE WHEN y THEN 1 ELSE 0 END) +
    ...
    (CASE WHEN z THEN 1 ELSE 0 END) +
)

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

Я правильно понимаю, что даже, если не знаешь язык SQL, то для повышения производительности, можно узнать код SQL через shell_plus --print-sql, скопировать этот код и выполнить необработанный запрос с помощью метода raw(), вставив туда свой скопированный sql код?

@Григорий_Кожанов, честно говоря данный метод лучше вообще не использовать. Он сделан лишь для того, что когда вы не можете написать какой-то очень сложный запрос через ORM, вы можете использовать метод raw().

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