如何在Django中编写自定义SQL查询?
我需要进行一个查询,但这并不简单,因为我不能使用django的Manager.raw()方法。
这是我的模型:
from django.db import models
from orion.apps.repuestos.models import Repuesto
from django.contrib.auth.models import User
from orion.apps.coches.models import Coche
from orion.apps.mecanicos.models import Mecanico
# Create your models here.
class Salida(models.Model):
repuesto = models.ForeignKey(Repuesto)
disponibilidad_actual = models.IntegerField(max_length=20)
cantidad_salida = models.IntegerField(max_length=20)
gasto = models.DecimalField(max_digits=10, decimal_places=2, blank=False)
created = models.DateTimeField(auto_now_add=True)
coche = models.ForeignKey(Coche)
class Remito(models.Model):
mecanico = models.ForeignKey(Mecanico)
created = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User)
observacion = models.TextField(max_length=300, blank=False)
class Remito_Salida(models.Model):
remito = models.ForeignKey(Remito)
salida = models.ForeignKey(Salida)
我尝试使用这个函数来进行查询。我需要获取从特定日期开始与特定的机械师相关的所有Salida。
在我的视图中,我写了以下代码:
def dictfetchall(cursor):
"Returns all rows from a cursor as a dict"
desc = cursor.description
return [
dict(zip([col[0] for col in desc], row))
for row in cursor.fetchall()
]
def my_custom_sql(fi):
cursor = connection.cursor()
cursor.execute('SELECT repuestos_repuesto.nombre, coches_coche.unidad, mecanicos_mecanico.nombres, mecanicos_mecanico.apellidos, salidas_salida.created, salidas_salida.gasto FROM salidas_salida, salidas_remito_salida, salidas_remito, coches_coche, mecanicos_mecanico, repuestos_repuesto WHERE salidas_salida.repuesto_id = repuestos_repuesto.id AND salidas_remito_salida.remito_id = salidas_remito.id AND salidas_remito_salida.salida_id = salidas_salida.id AND salidas_remito.mecanico_id = mecanicos_mecanico.id AND coches_coche.id = salidas_salida.coche_id AND salidas_salida.created >= "fi" AND mecanicos_mecanico.id = 1;')
row = dictfetchall(cursor)
return row
这里的fi是一个日期,而1是一个机械师的ID。
我遇到了这个错误:
ProgrammingError
attrib dows not exists «fi»
LINE 1: ...das_salida.coche_id AND salidas_salida.created >= "fi" AND ...
^
我使用的是django 1.6和postgresql 9.1。
我该如何解决这个问题呢?
1 个回答
0
我想你需要写这样的SQL查询,但我不确定这是否能解决你的问题。
def my_custom_sql(fi):
cursor = connection.cursor()
query = 'SELECT repuestos_repuesto.nombre, coches_coche.unidad, mecanicos_mecanico.nombres, mecanicos_mecanico.apellidos, salidas_salida.created, salidas_salida.gasto FROM salidas_salida, salidas_remito_salida, salidas_remito, coches_coche, mecanicos_mecanico, repuestos_repuesto WHERE salidas_salida.repuesto_id = repuestos_repuesto.id AND salidas_remito_salida.remito_id = salidas_remito.id AND salidas_remito_salida.salida_id = salidas_salida.id AND salidas_remito.mecanico_id = mecanicos_mecanico.id AND coches_coche.id = salidas_salida.coche_id AND salidas_salida.created >= %s AND mecanicos_mecanico.id = 1;'%fi
cursor.execute(query)
row = dictfetchall(cursor)
return row