首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`tortoise.field.ForeignKeyField`中关键字`related_name`的用法

`tortoise.field.ForeignKeyField`中关键字`related_name`的用法
EN

Stack Overflow用户
提问于 2021-10-30 12:15:43
回答 2查看 170关注 0票数 1

我读过乌龟-ORM的文档,但是,至少对我来说,文档并不清楚tortoise.field.ForeignKeyField中的关键字related_name。它只说明:

代码语言:javascript
复制
related_name:
    The attribute name on the related model to reverse resolve the foreign key.

我正在使用Aerich (乌龟-ORM迁移管理器),我看不到我的模型中使用的related_name的引用,我也检查了数据库Postgres,没有找到任何关于它的引用,也许我不知道去哪里找。

不幸的是,在Tortoise-ORM文档中没有关于这一点的简单的实用示例。

我有一个非常简单的模型,类似于:

代码语言:javascript
复制
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在这方面是如何工作的?

EN

回答 2

Stack Overflow用户

发布于 2021-10-30 12:55:10

由于乌龟的灵感来自于姜戈,你可以查看Django docs获得类似的答案。当你想要拿到Person's Toys时使用它。

代码语言:javascript
复制
person_a.toys_builder.all()

这就是为什么它被称为“反向解析”事件。

票数 1
EN

Stack Overflow用户

发布于 2021-10-30 12:55:37

经过几次尝试。

related_name值可以用作在外来模型中引用的名称,以便以相反的方向访问它。

让我们先展示一下前进的方向。在给定的示例中,从一个玩具模型实例(在本例中为pinocchio)中,使用以下命令找到他的builderowner

代码语言:javascript
复制
print(f"This is pinnochio owner {pinnochio.owner.name}")
print(f"This is pinnochio builder {pinnochio.owner.builder}")

related_name允许我们从相反的方向做同样的事情,从ownerbuilder,找到他/她的玩具并迭代它。例如:

代码语言:javascript
复制
person_b_owned_toys = await person_b.toys_owner.all()

for toy in person_b_owned_toys:
    print(toy.name)

除了all()方法之外,还可以使用filter()方法。返回仅包含与筛选器匹配的条目的QuerySet。例如:

代码语言:javascript
复制
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的参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69779542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档