如何在Django ORM的values中传递动态列名并解决字段识别错误?
解决Django中QueryDict字段名带空格无法匹配数据库字段的问题
Got it, let's break down what's happening here first:
从你的QueryDict能明显看到,用户提交的device值是u'Camera '——注意末尾多了个空格!但你的数据库表字段名是Camera(无空格),所以Django解析values(device)时,自然找不到带空格的字段名,才抛出了那串错误。
最简单的修复方法:去除空白字符
直接对拿到的device变量调用strip()方法,去掉字符串前后的空格、换行符等空白字符:
data = request.POST device = data.get('device', None) if device: # 把 'Camera ' 转成 'Camera',适配数据库字段名 device = device.strip() # 现在执行查询就不会报错了 Monitor.objects.values(device)
更严谨的做法:验证字段合法性
为了避免用户传入无效字段名(比如恶意构造的值),建议处理后再加一步字段存在性校验,确保device是Monitor模型的合法字段:
from django.db.models.fields import FieldDoesNotExist data = request.POST device = data.get('device', None) if device: device = device.strip() # 检查字段是否存在于Monitor模型中 try: Monitor._meta.get_field(device) except FieldDoesNotExist: # 这里可根据业务需求处理,比如用默认字段或返回错误提示 device = 'Camera' # 设置默认字段 # 也可以直接抛出异常:raise ValueError("Invalid device field name") # 安全执行查询 results = Monitor.objects.values(device)
额外建议:前端提前处理
如果可以的话,在前端表单的设备选择控件里,确保传递给后端的value值不带空格(比如把选项的value设为Camera而非Camera ),能从源头避免问题。不过后端的兜底处理依然必不可少,毕竟前端校验可能被绕过。
内容的提问来源于stack exchange,提问作者Janardhan Reddy. Meeniga
相关产品推荐
相关产品推荐

