首页 > 解决方案 > 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' 

我应该怎么办?

标签: djangodjango-modelsdjango-queryset

解决方案


django 无法执行您的查询。

我相信您试图通过原始功能实现的目标是不可能的。

阅读文档https://docs.djangoproject.com/en/3.0/topics/db/sql/以更好地理解函数的工作原理

您的动态选项与表字段和 where 参数相关:

  1. 选择字段

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

喜欢 :

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. where 参数

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

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)

推荐阅读