Django:将字典插入到my_model.objects.raw方法时出错

问题描述

我正在views.py内部的函数中执行查询,如下所示:

input_dict = {'id': 'id','table': 'my_table','first_col': 'my_first_col','first_name': 'my_first_name'}


query = '''
SELECT %(id)s
FROM %(table)s 
WHERE %(first_col)s = %(first_name)s '''


qs = my_model.objects.raw(query,input_dict)

print(qs)

打印:

qs: <RawQuerySet: 
            SELECT id
            FROM my_table 
            WHERE my_first_col = my_first_name >

但是,当我尝试运行此行时:

ids = [item.id for item in qs]

它给我一个错误

psycopg2.errors.SyntaxError: Syntax error at or near "'my_table'"
LINE 3:             FROM 'my_table' 

还有:

django.db.utils.ProgrammingError: Syntax error at or near "'my_table'"
LINE 3:             FROM 'my_table' 

我该怎么办?

解决方法

django无法执行您的查询。

我相信您尝试通过原始函数实现的目标是不可能的。

阅读文档https://docs.djangoproject.com/en/3.0/topics/db/sql/,以更好地了解该功能的工作原理

您的动态选项将同时应用于表字段和where参数:

  1. 选择字段

您可以使用翻译将查询中的字段映射到模型字段 raw()的参数

like:

name_map = {'first': 'first_name','last': 'last_name','bd': 'birth_date','pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table',translations=name_map)
  1. 参数在哪里

如果需要执行参数化查询,则可以使用参数 raw()的参数

lname = 'Doe'
Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s',[lname])

最终还是可以的,尽管除非您确切地知道自己在做什么,否则不建议这样做,因为它可能会使系统遭受sql攻击

query = '''
SELECT %(id)s
FROM %(table)s 
WHERE %(first_col)s = %(first_name)s '''

query = query%input_dict

qs = my_model.objects.raw(query)