如何解决Python Tortoise-ORM:在__str__中使用相关模型字段
我正在使用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}'
以便每个对象在描述中显示其相关模型。但是在Tortoise中我得到一个错误:
AttributeError:“ QuerySet”对象没有属性“ title”
我想不可能在__str__
方法中等待查询。因此,是否有可能使用Tortoise-ORM使用相关模型的字段来创建对象表示形式?
解决方法
Tortoise-ORM
不会自动从数据库中检索模型对象的相关数据,直到有人要求这样做为止。它只是为相关数据生成QuerySet
对象,而无需实际访问数据库。
要实际获取数据,您需要在打印对象之前使用prefetch_related()
或fetch_related()
。 Doc说:
关于
prefetch_related()
工作方式的一般规则是,相关模型的每个深度级别都会产生1个附加查询,因此.prefetch_related('events__participants')
将产生2个附加查询来获取数据。
像这样:
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。