Python Tortoise-ORM:使用 __str__ 中的相关模型字段
Python Tortoise-ORM: use related model field in __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' object has no attribute 'title'
我想在 __str__
方法中等待查询是不可能的。那么,是否有可能使用相关模型的字段来使用 Tortoise-ORM 创建对象表示?
Tortoise-ORM
不会自动从数据库中检索模型对象的相关数据,除非有人要求它这样做。它只是为相关数据生成 QuerySet
对象,而不实际访问数据库。
要实际获取数据,您需要在打印对象之前使用 prefetch_related()
或 fetch_related()
。 Documentation 说:
General rule about how prefetch_related()
works is that each level of depth of related models produces 1 additional query, so .prefetch_related('events__participants')
will produce two additional queries to fetch your data.
像这样:
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)
我正在使用 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' object has no attribute 'title'
我想在 __str__
方法中等待查询是不可能的。那么,是否有可能使用相关模型的字段来使用 Tortoise-ORM 创建对象表示?
Tortoise-ORM
不会自动从数据库中检索模型对象的相关数据,除非有人要求它这样做。它只是为相关数据生成 QuerySet
对象,而不实际访问数据库。
要实际获取数据,您需要在打印对象之前使用 prefetch_related()
或 fetch_related()
。 Documentation 说:
General rule about how
prefetch_related()
works is that each level of depth of related models produces 1 additional query, so.prefetch_related('events__participants')
will produce two additional queries to fetch your data.
像这样:
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)