2011-05-09 36 views
19

¿Cómo realizaría lo siguiente con sql sin formato en views.py?Consultas sql sin procesar en vistas de Django

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 sería esta función de resultados? Gracias.

+3

por qué le gustaría utilizar SQL prima para que la consulta sobre el filtrado y contar? – DTing

+10

No hay ninguna razón práctica para este caso. Solo para ver/saber cómo hacerlo. – David542

Respuesta

34
>>> 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 

uso cláusula WHERE para filtrar votar por sí:

>>> cursor.execute('''SELECT count(*) FROM people_person WHERE vote = "yes"''') 
1L 
+0

¡Muy útil! ¡Gracias! Usé 'rows = cursor.fetchall()'. – mescarra

+0

@mescarra Gracias por publicar esta pregunta. También probé la misma solución, ¿también recibió algo como esto? (1L, división A: agricultura, silvicultura y pesca) (2L, división D: minería) (3L, división D) : Construction ') (4L, u'Division D: Manufacturing'). ¿Cómo se las arregló para obtener más valores separados de usted y L? Gracias. – Simer

31

The Django Documentation is really really good. Tiene básicamente dos opciones para ejecutar SQL sin formato. Puede usar Manager.raw() para realizar consultas sin procesar que devuelven instancias del modelo, o puede evitar la capa del modelo y ejecutar SQL personalizado directamente.

Utilizando el raw() gerente:

>>> for p in Person.objects.raw('SELECT * FROM myapp_person'): 
...  print p 
John Smith 
Jane Jones 

Si desea omitir la capa de modelo directamente puede utilizar django.db.connection que representa la conexión de base de datos por defecto:

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 
+1

+1 buena explicación, ¿podría devolver un conteo usando Raw? – DTing

+0

No, devuelve un 'RawQuerySet' que solo es útil si desea devolver una instancia de modelo. Para realizar 'count (*)' o cualquier otra cosa donde no desee devolver una instancia de modelo, es mejor que simplemente use 'django.db.connection'. – zeekay

0

puede probar esta

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 ") 
Cuestiones relacionadas