Django中如何使用原生SQL关联当前登录request.user查询对应Student数据
当前实现完全无法正常完成查询
核心问题说明
- 你最初的查询逻辑(用当前登录用户的id匹配Student表的关联ID)本身是符合表关联设计的,问题完全出在SQL参数的传递方式上。
- 原生SQL是独立发送给数据库执行的静态字符串,你代码里写的
WHERE ID = a不会自动关联到Python代码中赋值的a = request.user.id变量。数据库执行这段SQL时,会把a识别为表中的列名,要么直接抛出“不存在名为a的列”的语法错误;万一刚好表结构里有叫a的字段,也会错误执行两列值的匹配,完全拿不到当前登录用户对应的Student数据。 - 这种直接把变量嵌入SQL字符串的写法,后续就算手动替换字符串值,也会存在SQL注入的安全隐患,不符合Django原生SQL的开发规范。
合规的修正实现
按照Django原生SQL的标准传参机制,将查询值作为独立参数传给execute方法,由数据库驱动完成参数转义和绑定,既不会有语法问题,也能规避注入风险:
def profile(request): cursor = connection.cursor() current_user_id = request.user.id # 用占位符声明参数位置,将真实值放在execute的第二个参数中传入 cursor.execute("SELECT * from Student WHERE ID = %s ", [current_user_id]) data = dictfetchall(cursor) return render(request, 'personal.html', {'data': data})
提示:Django会自动适配当前使用数据库对应的占位符语法,不需要手动修改占位符格式,直接使用
%s作为占位符标记即可。
内容的提问来源于stack exchange,提问作者james54
相关产品推荐
相关产品推荐

