Django中如何使用Join查询获取关联表tableB的名称字段?
解决Django中关联表查询的问题
嘿,作为Python/Django新手遇到这种关联数据查询的问题太正常了,我来给你捋清楚怎么实现你想要的结果~
首先咱们先确认你的模型定义是否正确(这是关联查询的基础),根据你给出的数据表结构,模型应该是这样的(注意Django里模型字段一般用小写,和数据库字段对应):
from django.db import models class TableB(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=100) # 可选:定义__str__方便查看对象 def __str__(self): return self.name class TableA(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=100) desc = models.CharField(max_length=200) # 外键关联TableB,db_column对应数据库里的tableBID字段 table_b = models.ForeignKey(TableB, on_delete=models.CASCADE, db_column='tableBID') def __str__(self): return self.name
接下来,你原来的tableA.objects.all()只会查询TableA的数据,当你需要同时获取关联的TableB数据时,需要用**select_related**来预加载关联对象——它会在查询TableA的时候自动执行SQL JOIN,一次性把关联的TableB数据也查出来,避免后续每条数据都单独查一次数据库的N+1性能问题。
方法1:通过对象属性获取关联数据
先执行查询:
records = TableA.objects.select_related('table_b').all()
然后遍历records,直接通过对象属性访问TableB的name字段:
for record in records: # 按照你想要的格式输出 print(f"{record.id} {record.name} {record.desc} {record.table_b.id} {record.table_b.name}")
运行后就能得到你期望的结果:
1 ABC testdesc 1 firstName 2 XYZ testdes 2 Second Name
方法2:直接查询指定字段(返回元组列表)
如果你不需要完整的模型对象,只想直接拿到需要的字段数据,可以用values_list,这样更高效:
records = TableA.objects.select_related('table_b').values_list( 'id', 'name', 'desc', 'table_b__id', 'table_b__name' )
此时records就是包含所有需要字段的元组列表,直接输出就能得到你要的格式:
for item in records: print(' '.join(map(str, item)))
补充说明
select_related只适用于多对一/一对一的关联关系(比如这里TableA关联TableB的外键),如果是多对多或者反向查询,需要用prefetch_related。- 如果你没用到
select_related,直接访问record.table_b.name也能拿到数据,但Django会在每次访问时单独发一次SQL查询,数据多的时候会很慢,所以尽量用select_related预加载。
内容的提问来源于stack exchange,提问作者vishu
相关产品推荐
相关产品推荐

