【问题标题】:Python Tortoise-ORM: use related model field in __str__Python Tortoise-ORM:在 __str__ 中使用相关模型字段
【发布时间】:2023-03-22 07:40:01
【问题描述】:

我正在使用 AIOHTTP 开发 API 服务,我尝试集成一些异步 ORM,第一个候选者是 Tortoise-ORM。 在一个 Django 项目中,我有很多使用 __str__ 方法的链接模型,如下所示:

from tortoise.models import Model
from tortoise import fields

class Department(Model):
    id = fields.IntField(pk=True)
    title = fields.TextField()
    upper = fields.ForeignKeyField('models.Department', related_name='children')

    def __str__(self):
        if self.upper is not None:
            return f'{self.id} Department {self.title} of {self.upper.title}'
        else:
            return f'{self.id} Department {self.title}, head'

class Employee(Model):
    id = fields.IntField(pk=True)
    name = fields.TextField()
    dep = fields.ForeignKeyField('models.Department', related_name='employees')

    def __str__(self):
        return f'{self.id}. Employee {self.name} of {self.dep.title}'

以便每个对象在描述中显示它的相关模型。但在乌龟我得到一个错误:

AttributeError: 'QuerySet' 对象没有属性 'title'

我想在__str__ 方法中等待查询是不可能的。那么,是否有可能使用相关模型的字段来使用 Tortoise-ORM 创建对象表示?

【问题讨论】:

    标签: python orm python-asyncio aiohttp tortoise-orm


    【解决方案1】:

    Tortoise-ORM 不会自动从数据库中检索模型对象的相关数据,直到有人要求它这样做。它只是为相关数据生成QuerySet 对象,而不实际访问数据库。

    要实际获取数据,您需要在打印对象之前使用prefetch_related()fetch_related()Documentation 说:

    prefetch_related() 工作方式的一般规则是,相关模型的每个深度级别都会产生 1 个额外的查询,因此 .prefetch_related('events__participants') 会产生两个额外的查询来获取您的数据。

    像这样:

        emp_one = await Employee.filter(name="Emp_1").prefetch_related("dep").first()
        print(emp_one)
    
        emp_two = await Employee.filter(name="Emp_2").first()
        await emp_two.fetch_related("dep")
        print(emp_two)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2021-02-06
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2021-08-30
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多