如何在Django中编写自定义SQL查询?

0 投票
1 回答
575 浏览
提问于 2025-04-18 07:15

我需要进行一个查询,但这并不简单,因为我不能使用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

撰写回答