inspectdb - docs django project
Consultas crudas de sql en vistas de Django (3)
Puedes probar esto
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 ")
¿Cómo realizaría lo siguiente usando sql sin formato en 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))
¿Cómo se vería esta función de resultados? Gracias.
La documentación de Django es realmente buena. Básicamente tienes dos opciones para ejecutar SQL en bruto. Puede usar Manager.raw()
para realizar consultas en bruto que devuelven instancias del modelo, o puede evitar la capa del modelo y ejecutar SQL personalizado directamente.
Usando el administrador en raw()
:
>>> for p in Person.objects.raw(''SELECT * FROM myapp_person''):
... print p
John Smith
Jane Jones
Si desea omitir la capa del modelo directamente, puede usar django.db.connection
que representa la conexión de base de datos predeterminada:
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
>>> 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
use la cláusula WHERE para filtrar el voto por sí:
>>> cursor.execute(''''''SELECT count(*) FROM people_person WHERE vote = "yes"'''''')
1L