Django使用select_related查询时无法获取关联表字段数据如何解决
错误原因
你调用ProblemProductBind.objects.all().select_related('prod_id')返回的prod是Django QuerySet集合对象,不是单条ProblemProductBind模型实例,集合本身自然没有关联表的pImage属性。
正确获取关联字段的方法
要访问关联表字段,需要先拿到ProblemProductBind的单条实例,再通过外键字段prod_id访问关联的Products实例的对应属性即可,以下是常见场景的写法:
场景1:遍历所有查询结果,批量获取关联字段
# 建议命名区分QuerySet和单实例,避免混淆 prod_bind_qs = ProblemProductBind.objects.all().select_related('prod_id') for bind_obj in prod_bind_qs: # 外键字段prod_id对应关联的Products实例,直接.属性名就可以拿到对应值 product_image = bind_obj.prod_id.pImage product_name = bind_obj.prod_id.pName # 其他Products表字段同理,比如: repair_flag = bind_obj.prod_id.weRepair # 也可以继续访问Products表关联的其他外键字段,比如所属分类 category_name = bind_obj.prod_id.cat_id.xxx # xxx替换为ProdCat模型的对应字段名
场景2:只需要获取单条数据的关联字段
如果只需单条结果,先从QuerySet中取出单实例再访问即可:
# 取查询结果的第一条 first_bind = ProblemProductBind.objects.select_related('prod_id').first() if first_bind: product_image = first_bind.prod_id.pImage # 按条件查询指定单条数据 target_bind = ProblemProductBind.objects.select_related('prod_id').get(id=1) # 替换为你的过滤条件 product_image = target_bind.prod_id.pImage
补充优化建议
你的外键字段命名带_id后缀容易产生混淆:Django默认会给外键字段自动生成带_id后缀的属性存储关联表的主键值,你现在命名为prod_id的话,实际存储Products主键的属性会变成prod_id_id,可读性很差。建议把外键字段重命名为prod,后续访问关联字段的写法会变成bind_obj.prod.pImage,更直观易懂。
内容的提问来源于stack exchange,提问作者OCT-DEVELOPERS
相关产品推荐
相关产品推荐

