Документация Django действительно хороша. У вас есть два основных варианта выполнения необработанного SQL. Вы можете использовать Manager.raw()
для выполнения необработанных запросов, которые возвращают экземпляры модели, или вы можете избежать уровня модели и напрямую выполнить пользовательский SQL.
Использование менеджера raw()
:
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
... print p
John Smith
Jane Jones
Если вы хотите напрямую обойти слой модели, вы можете использовать django.db.connection
, который представляет собой соединение с базой данных по умолчанию:
def my_custom_sql():
from django.db import connection, transaction
cursor = connection.cursor()
# Data modifying operation - commit required
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
transaction.commit_unless_managed()
# Data retrieval operation - no commit required
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row