specific inspectdb english documentacion docs django django-models django-views

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