RawQueryset失效触发ProgrammingError:参数绑定类型不支持问题排查
问题解决:Django RawQueryset 触发 ProgrammingError 错误
错误根源
- 参数传递错误:
views.py中sizes的Raw查询里,你传入了[id]作为参数,但这里的id是Python内置的id()函数(并非产品ID数值),数据库无法识别函数对象,因此抛出Error binding parameter 1: type 'builtin_function_or_method' is not supported错误。 - 模板字段访问错误:模板中
{{rs.size_id.title}}逻辑有误——size_id是整数类型的外键ID,不存在title属性,需访问关联的Size对象字段。
修复方案
方案1:修正Raw查询参数
将[id]替换为[product.id],确保传递的是产品ID数值:
if product.variant != "None": variants = Variants.objects.filter(product_id=product.id) colors = Variants.objects.filter(product_id=product.id, size_id=variants[0].size_id) # 修正参数为 product.id sizes = Variants.objects.raw("SELECT * FROM core_variants WHERE product_id=%s GROUP BY size_id", [product.id]) variant = Variants.objects.get(id=variants[0].id) context = {'sizes': sizes, 'colors': colors, 'variant': variant, } return render(request, 'core/product-details.html', context)
同时修正模板字段访问(前提是Variants模型中size是指向Size模型的外键):
<select name="size" id="size" class="form-control"> {% for rs in sizes %} <option {% if variant.size_id == rs.size_id %}selected{% endif %} value="{{rs.size_id}}">{{rs.size.title}}</option> {% endfor %} </select>
方案2:(推荐)用Django ORM替代Raw查询
Raw查询存在SQL注入风险,更推荐用ORM的values()+distinct()实现分组逻辑:
if product.variant != "None": variants = Variants.objects.filter(product_id=product.id) colors = Variants.objects.filter(product_id=product.id, size_id=variants[0].size_id) # 用ORM实现分组去重 sizes = Variants.objects.filter(product_id=product.id).values('size_id', 'size__title').distinct('size_id') variant = Variants.objects.get(id=variants[0].id) context = {'sizes': sizes, 'colors': colors, 'variant': variant, } return render(request, 'core/product-details.html', context)
对应模板调整为:
<select name="size" id="size" class="form-control"> {% for rs in sizes %} <option {% if variant.size_id == rs.size_id %}selected{% endif %} value="{{rs.size_id}}">{{rs.size__title}}</option> {% endfor %} </select>
内容的提问来源于stack exchange,提问作者Sabab
相关产品推荐
相关产品推荐

