Comment pourrais-je effectuer les opérations suivantes en utilisant du SQL brut dans views.py
?
from app.models import Picture
def results(request):
all = Picture.objects.all()
yes = Picture.objects.filter(vote='yes').count()
return render_to_response('results.html', {'picture':picture, 'all':all, 'yes': yes}, context_instance=RequestContext(request))
À quoi ressemblerait cette fonction results
?
>>> from Django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute('''SELECT count(*) FROM people_person''')
1L
>>> row = cursor.fetchone()
>>> print row
(12L,)
>>> Person.objects.all().count()
12
utilisez la clause WHERE pour filtrer le vote pour oui:
>>> cursor.execute('''SELECT count(*) FROM people_person WHERE vote = "yes"''')
1L
La documentation Django est vraiment très bonne. Vous avez essentiellement deux options pour exécuter du SQL brut. Vous pouvez utiliser Manager.raw()
pour effectuer des requêtes brutes qui renvoient des instances de modèle, ou vous pouvez éviter la couche de modèle et exécuter directement du SQL personnalisé.
Utilisation du gestionnaire raw()
:
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
... print p
John Smith
Jane Jones
Si vous souhaitez contourner directement la couche modèle, vous pouvez utiliser Django.db.connection
qui représente la connexion à la base de données par défaut:
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
Vous pouvez essayer ceci
Picture.objects.raw("SELECT 1 as id ,"\
"(SELECT count(*) as yes FROM people_person WHERE vote='yes') as yes ,"\
"(SELECT count(*) FROM people_person WHERE vote='no') as no ,"\
"(SELECT count(*) FROM people_person WHERE vote='all') as all ")