You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django查询子表记录时如何获取关联父表字段?

解决Django中select_related后values()无法获取父表字段的问题

别担心,新手遇到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:37:52