我读过乌龟-ORM的文档,但是,至少对我来说,文档并不清楚tortoise.field.ForeignKeyField中的关键字related_name。它只说明:
related_name:
The attribute name on the related model to reverse resolve the foreign key.我正在使用Aerich (乌龟-ORM迁移管理器),我看不到我的模型中使用的related_name的引用,我也检查了数据库Postgres,没有找到任何关于它的引用,也许我不知道去哪里找。
不幸的是,在Tortoise-ORM文档中没有关于这一点的简单的实用示例。
我有一个非常简单的模型,类似于:
import tortoise
class Toy(tortoise.models.Model):
id = tortoise.fields.IntField(pk=True)
name = tortoise.fields.CharField(max_length=32)
owner = tortoise.fields.ForeignKeyField("models.Person", related_name='toys_owner')
builder = tortoise.fields.ForeignKeyField("models.Person", related_name='toys_builder')
class Person(tortoise.models.Model):
id = tortoise.fields.IntField(pk=True)
name = tortoise.fields.CharField(max_length=32)
async def main():
await tortoise.Tortoise.init(
db_url='sqlite://:memory:',
modules={'models': ["__main__"]}
)
await tortoise.Tortoise.generate_schemas()
person_a = await Person.create(name="Gepheto")
person_b = await Person.create(name="Fairy")
person_c = await Person.create(name="Nobody")
pinocchio = await Toy.create(name="Pinocchio", builder=person_a, owner=person_b)
print(pinocchio)
await tortoise.Tortoise.close_connections()
if __name__ == '__main__':
tortoise.run_async(main())related_name在这方面是如何工作的?
发布于 2021-10-30 12:55:10
由于乌龟的灵感来自于姜戈,你可以查看Django docs获得类似的答案。当你想要拿到Person's Toys时使用它。
person_a.toys_builder.all()这就是为什么它被称为“反向解析”事件。
发布于 2021-10-30 12:55:37
经过几次尝试。
related_name值可以用作在外来模型中引用的名称,以便以相反的方向访问它。
让我们先展示一下前进的方向。在给定的示例中,从一个玩具模型实例(在本例中为pinocchio)中,使用以下命令找到他的builder或owner:
print(f"This is pinnochio owner {pinnochio.owner.name}")
print(f"This is pinnochio builder {pinnochio.owner.builder}")related_name允许我们从相反的方向做同样的事情,从owner或builder,找到他/她的玩具并迭代它。例如:
person_b_owned_toys = await person_b.toys_owner.all()
for toy in person_b_owned_toys:
print(toy.name)除了all()方法之外,还可以使用filter()方法。返回仅包含与筛选器匹配的条目的QuerySet。例如:
person_b_owned_toys = await person_b.toys_owner.filter(name='Pinocchio')
for toy in person_b_owned_toys:
print(toy.name)相反方向的filter参数上的有效keys是来自Toys的参数,而不是来自Person的参数。
https://stackoverflow.com/questions/69779542
复制相似问题