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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:49:55