Django查询子表记录时如何获取关联父表字段?
别担心,新手遇到ORM的这种小细节困惑太正常啦!我来帮你理清楚问题出在哪,以及怎么解决。
问题原因
你用了select_related("event_code")确实做了表JOIN(所以.query能看到选中了所有字段),但values()方法默认只会返回当前模型(这里是SecondTable)的字段,不会自动包含关联表的字段,哪怕已经预取了关联数据。
两种解决方法
1. 在values()中显式指定关联字段
你可以通过关联字段名__父表字段名的格式,把需要的父表字段明确写在values()里,这样就能拿到所有想要的数据了:
# 明确指定需要的字段,包括父表的 results = SecondTable.objects.all().select_related("event_code").values( 'id', # SecondTable自身的字段 'wasfun', 'event_code__event_title', # 父表Record的字段 'event_code__event_description' ) # 遍历结果就能看到父表字段了 for item in results: print(item['event_code__event_title'], item['event_code__event_description'])
2. 直接遍历模型对象(更直观)
既然已经用select_related预取了关联数据,你完全可以不用values(),直接遍历查询出来的SecondTable对象,通过对象属性访问父表字段——这样不会产生额外的数据库查询,代码也更易读:
# 预取关联数据后,直接获取对象 second_table_objs = SecondTable.objects.all().select_related("event_code") for obj in second_table_objs: # 直接通过obj.event_code访问父表对象的字段 print(f"标题: {obj.event_code.event_title}, 描述: {obj.event_code.event_description}, 是否有趣: {obj.wasfun}")
额外小纠正&提示
- 你的模型里写的
BoolField是笔误哦,Django里正确的字段名是BooleanField,记得修正过来~ - 如果业务经常需要获取这些关联字段,还可以在
SecondTable模型里添加属性方法简化访问:
class SecondTable(models.Model): event_code=models.ForeignKey(Record, default=0, on_delete=models.CASCADE) wasfun=models.BooleanField(default=True) @property def event_title(self): return self.event_code.event_title @property def event_description(self): return self.event_code.event_description
之后就可以直接用obj.event_title来访问父表的标题字段啦!
内容的提问来源于stack exchange,提问作者Tyler Russell
相关产品推荐
相关产品推荐

