1

我已经阅读了 Tortoise-ORM 的文档,但是,至少对我来说,文档并不清楚related_name. tortoise.field.ForeignKeyField它仅声明:

related_name:
    The attribute name on the related model to reverse resolve the foreign key.

我正在使用 Aerich(Tortoise-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运作?

4

2 回答 2

1

由于乌龟受到 Django 的启发,您可以查看Django 文档以获得类似的答案。当您想要到达 Person's Toys 时使用它。

person_a.toys_builder.all()

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

于 2021-10-30T12:55:09.657 回答
1

经过几次尝试...

related_name值可以用作外部模型中要引用的名称,以反向访问它。

让我们首先显示前进方向。在给出的示例中,从 Toy 模型实例(在本例中pinocchio)中,找到他的builderor owner

print(f"This is pinnochio owner {pinnochio.owner.name}")
print(f"This is pinnochio builder {pinnochio.owner.builder}")

related_name允许我们在相反的方向上做同样的事情,从owneror 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)

反向的有效keyson参数是那些 from ,而不是 from 。filterToysPerson

于 2021-10-30T12:55:36.533 回答