【问题标题】:raw query with primary key带有主键的原始查询
【发布时间】:2016-12-12 20:47:05
【问题描述】:

我的模型

class Despacho (models.Model):  
    bus=models.ForeignKey(Bus)  
    contador = models.IntegerField()
    cerrado = models.BooleanField(editable=False)

class Bus(models.Model):    
    numero_bus=models.CharField(max_length=255,unique=True)
    en_ruta = models.BooleanField(editable=False)   

我需要一个查询来提取我保存总线的数据,然后我输入一个 公共汽车的号码,我需要知道是否有调度 匹配搜索尝试执行以下查询

我的数据库是postgresql

d = Despacho.objects.raw('''SELECT * FROM operaciones_despacho WHERE operaciones_despacho.bus =  '%s' AND operaciones_despacho.cerrado = '%s'                                                    
;'''%(bus.numero_bus,False)) 

错误:operaciones_despacho.bus 列不存在

【问题讨论】:

  • 您认为为什么需要执行原始查询?更糟糕的是,为什么你认为你需要错误地执行它
  • 我也想知道你为什么需要原始请求?
  • Ignacio 暗示的是您的代码容易受到 SQL 注入攻击。这是在原始查询上使用 ORM 的重要原因之一:它再次保护您可能导致漏洞的错误。

标签: python django postgresql django-models


【解决方案1】:

首先在 Django 中,我们仅在极少数情况下使用原始 sql,即特别难以编写 ORM 查询。在这种情况下,编写 ORM 查询比原始查询更容易且更短。

Despacho.objects.filter(bus=bus).filter(cerrado=False)

在需要执行原始查询的极少数情况下,请注意使用 params 参数作为 raw 而不是字符串格式。编写原始查询的正确方法是

Despacho.objects.raw('''SELECT * FROM operaciones_despacho WHERE operaciones_despacho.bus =  '%s' AND operaciones_despacho.cerrado = '%s'''' ,
 [bus.numero_bus,False]) 

但我再次强调,您不应该在这里使用原始查询,因为它是一个简单的 ORM 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2014-01-21
    • 2020-05-09
    • 2021-02-19
    • 2017-10-04
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多