Django多表关联查询:从Orden获取Productos的nombre字段
解决Django关联查询获取Productos的nombre属性问题
你的查询仅返回Productos的ID,是因为producto__producto仅关联到ProductosOrden模型中的producto外键字段,默认返回该外键的主键值。要获取Productos模型的nombre属性,需要向下再关联一层,具体方法如下:
方法1:使用values()直接指定目标字段
修改查询语句,通过双下划线关联到Productos的nombre字段:
orden_productos_nombres = Orden.objects.filter( user=self.request.user, ref_code='225v3cwhvqi0ymp2yw2n' ).values('producto__producto__nombre')
执行后会返回包含目标字段的QuerySet:
<QuerySet [{'producto__producto__nombre': '商品A'}, {'producto__producto__nombre': '商品B'}, ...]>
方法2:获取完整对象后访问属性(适合后续业务逻辑处理)
如果需要操作完整的模型对象,建议结合prefetch_related优化多对多关联查询,避免N+1查询问题:
# 获取目标订单对象 orden = Orden.objects.filter( user=self.request.user, ref_code='225v3cwhvqi0ymp2yw2n' ).prefetch_related('producto__producto').first() # 遍历提取所有商品名称 if orden: nombres = [po.producto.nombre for po in orden.producto.all()]
此时nombres会是一个包含对应Productos的nombre的列表。
补充说明
- 关联查询的双下划线规则:
模型字段__关联模型字段__目标字段,这里producto是Orden的多对多字段(关联ProductosOrden),producto__producto是ProductosOrden关联Productos的外键,最后__nombre就是Productos的目标字段。 - 若需同时获取多个字段(比如nombre和precio_publico),可在values中添加多个参数:
values('producto__producto__nombre', 'producto__producto__precio_publico')
内容的提问来源于stack exchange,提问作者Jorge López
相关产品推荐
相关产品推荐

