python - Tortoise ORM for Python 没有返回实体的关系(Pyndantic,FastAPI)

标签 python postgresql fastapi pydantic tortoise-orm

我正在使用 Tortoise ORM 作为异步 orm 库制作一个示例 Fast Api 服务器,但我似乎无法返回我定义的关系。这些是我的关系:

# Category
from tortoise.fields.data import DatetimeField
from tortoise.models import Model
from tortoise.fields import UUIDField, CharField
from tortoise.fields.relational import ManyToManyField
from tortoise.contrib.pydantic import pydantic_model_creator


class Category(Model):
    id = UUIDField(pk=True)
    name = CharField(max_length=255)
    description = CharField(max_length=255)
    keywords = ManyToManyField(
        "models.Keyword", related_name="categories", through="category_keywords"
    )
    created_on = DatetimeField(auto_now_add=True)
    updated_on = DatetimeField(auto_now=True)



Category_dto = pydantic_model_creator(Category, name="Category", allow_cycles = True)
# Keyword
from models.expense import Expense
from models.category import Category
from tortoise.fields.data import DatetimeField
from tortoise.fields.relational import ManyToManyRelation
from tortoise.models import Model
from tortoise.fields import UUIDField, CharField
from tortoise.contrib.pydantic import pydantic_model_creator


class Keyword(Model):
    id = UUIDField(pk=True)
    name = CharField(max_length=255)
    description = CharField(max_length=255)
    categories: ManyToManyRelation[Category]
    expenses: ManyToManyRelation[Expense]
    created_on = DatetimeField(auto_now_add=True)
    updated_on = DatetimeField(auto_now=True)

    class Meta:
        table="keyword"


Keyword_dto = pydantic_model_creator(Keyword)
表已正确创建。将关键字添加到类别时,数据库状态都很好。问题是当我想查询类别并包含关键字时。我有这个代码:
class CategoryRepository():

    @staticmethod
    async def get_one(id: str) -> Category:
        category_orm = await Category.get_or_none(id=id).prefetch_related('keywords')
        if (category_orm is None):
            raise NotFoundHTTP('Category')
        return category_orm
在这里调试 category_orm 我有以下内容:
category_orm debug at run-time
哪种告诉我它们已加载。
然后当我不能使用 Pydantic 模型时,我有这个代码
class CategoryUseCases():

    @staticmethod
    async def get_one(id: str) -> Category_dto:
        category_orm = await CategoryRepository.get_one(id)
        category = await Category_dto.from_tortoise_orm(category_orm)
        return category
和调试这个,没有keywords field
category (pydantic) debug at run-time
查看 tortoise orm 源代码的函数from_tortoise_orm
@classmethod
    async def from_tortoise_orm(cls, obj: "Model") -> "PydanticModel":
        """
        Returns a serializable pydantic model instance built from the provided model instance.

        .. note::

            This will prefetch all the relations automatically. It is probably what you want.
但我的关系没有回来。任何人都有类似的经历?

最佳答案

当尝试生成 pydantic 模型时会出现此问题 之前 Tortoise ORM 已初始化。如果你看 basic pydantic例如,您将看到所有 pydantic_model_creator被称为 Tortoise.init .
显而易见的解决方案是在 Tortoise 初始化之后创建 pydantic 模型,如下所示:


await Tortoise.init(db_url="sqlite://:memory:", modules={"models": ["__main__"]})
await Tortoise.generate_schemas()

Event_Pydantic = pydantic_model_creator(Event)

或者更方便的方法,通过 Tortoise.init_models() 使用早期模型 init .像这样:

from tortoise import Tortoise

Tortoise.init_models(["__main__"], "models")
Tournament_Pydantic = pydantic_model_creator(Tournament)
在这种情况下,主要思想是将 pydantic 和 db 模型拆分为不同的模块,以便导入第一个不会导致提前创建第二个。并确保拨打 Tortoise.init_models()在创建pydantic模型之前。
可以在 here 中找到更详细的示例说明。 .

关于python - Tortoise ORM for Python 没有返回实体的关系(Pyndantic,FastAPI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65531387/

相关文章:

python - XML解析Python

python - 无法构建opencv-python

postgresql - 将 OpenEdge 升级到 PostgreSQL 数据库

python - 构建 FastAPI 项目的最佳实践是什么?

python - FastAPI:即使数据无效也将数据显示在 View 中

python - 替代 python 安装时出现 xvfbwrapper 导入错误

python - 覆盖 odoo 8 中的 write() 方法导致 RuntimeError : maximum recursion depth exceeded

sql - Rails 4 按 has_many 计数排序

postgresql - PostGIS:创建扩展失败

postgresql - ormar 中的 Alembic 迁移不起作用(FastAPI)