Tortoise ORM中能否用only()指定关联模型字段进行查询?
在Tortoise ORM中用only()指定关联模型字段的正确方式
Tortoise ORM的only()方法不支持直接通过双下划线(比如provider__description)指定关联模型的字段,这就是你触发KeyError的原因——only()只能识别当前查询模型本身的字段,关联字段的双下划线语法在这里不生效,不管你调整select_related()/prefetch_related()的调用顺序都没用。
正确的做法是,在加载关联模型的方法里(select_related或prefetch_related),给关联模型单独指定only()筛选:
示例代码
假设你的模型结构是这样:
from tortoise.models import Model from tortoise import fields class Provider(Model): description = fields.CharField(max_length=255) class Product(Model): name = fields.CharField(max_length=255) provider = fields.ForeignKeyField("models.Provider", related_name="products")
针对一对一外键(用select_related)
# 加载Product的name字段,同时加载关联Provider的description字段 products = await Product.all().select_related( "provider", # 给关联的Provider模型指定要保留的字段 {"provider": lambda q: q.only("description")} ).only("name")
针对多对多/反向外键(用prefetch_related)
# 反向查询Provider时加载关联的Product的name字段 providers = await Provider.all().prefetch_related( "products", {"products": lambda q: q.only("name")} ).only("description")
核心逻辑
- 主模型的字段直接用顶层的
only()指定 - 关联模型的字段需要在
select_related/prefetch_related的参数里,通过lambda表达式给对应的关联模型单独设置only()
内容的提问来源于stack exchange,提问作者Pikabo
相关产品推荐
相关产品推荐

