Python 使用动态键创建Pydantic模型模式

Python 使用动态键创建Pydantic模型模式,python,fastapi,pydantic,Python,Fastapi,Pydantic,我正在尝试为以下JSON实现Pydantic模式模型 { "description": "Best Authors And Their Books", "authorInfo": { "KISHAN": { "numberOfBooks": 10, "bestBookIds&q

我正在尝试为以下JSON实现Pydantic模式模型

{
    "description": "Best Authors And Their Books",
    "authorInfo":
    {
        "KISHAN":
            {
            "numberOfBooks": 10,
            "bestBookIds": [0, 2, 3, 7]
            },
        "BALARAM":
            {
            "numberOfBooks": 15,
            "bestBookIds": [10, 12, 14]
            },
        "RAM":
            {
            "numberOfBooks": 6,
            "bestBookIds": [3,5]

        }
    }
}
以下是Pydantic中的模式对象

from typing import List, Type, Dict
from pydantic import BaseModel

class AuthorBookDetails(BaseModel):
    numberOfBooks: int
    bestBookIds: List[int]

class AuthorInfoCreate(BaseModel):
    __root__: Dict[str, Type[AuthorBookDetails]]    
#pass

class ScreenCreate(BaseModel):
    description: str
    authorInfo: Type[AuthorInfoCreate]
我正在按如下方式解析AuthorInfo创建:

y = AuthorBookDetails( numberOfBooks = 10, bestBookIds = [3,5])
print(y)
print(type(y))

x = AuthorInfoCreate.parse_obj({"RAM" : y})
print(x)
我看到以下错误

numberOfBooks=10 bestBookIds=[3, 5]

<class '__main__.AuthorBookDetails'>

Traceback (most recent call last):

  File "test.py", line 44, in <module>

    x = AuthorInfoCreate.parse_obj({"RAM": y})

  File "C:\sources\rep-funds\env\lib\site-packages\pydantic\main.py", line 402, in parse_obj

    return cls(**obj)

  File "C:\sources\rep-funds\env\lib\site-packages\pydantic\main.py", line 283, in __init__

    raise validation_error

pydantic.error_wrappers.ValidationError: 1 validation error for AuthorInfoCreate

__root__ -> RAM

  subclass of AuthorBookDetails expected (type=type_error.subclass; expected_class=AuthorBookDetails)
numberOfBooks=10个最佳图书ID=[3,5]
回溯(最近一次呼叫最后一次):
文件“test.py”,第44行,在
x=AuthorInfoCreate.parse_obj({“RAM”:y})
文件“C:\sources\rep funds\env\lib\site packages\pydantic\main.py”,第402行,在parse_obj中
返回cls(**obj)
文件“C:\sources\rep funds\env\lib\site packages\pydantic\main.py”,第283行,在\uuu init中__
引发验证错误
pydantic.error\u wrappers.ValidationError:AuthorInfo创建的1个验证错误
__根目录->内存
应为AuthorBookDetails的子类(type=type_error.subclass;应为_class=AuthorBookDetails)

我想了解如何更改AuthorInfoCreate,以便提及json模式。

实际上,您应该从类型注释中删除类型。您需要类的实例,而不是实际的类。请尝试以下解决方案:

从键入导入列表,Dict
从pydantic导入BaseModel
类AuthorBookDetails(基本模型):
书籍数量:int
最佳图书编号:列表[int]
类AuthorInfo创建(BaseModel):
__根目录:Dict[str,AuthorBookDetails]
类ScreenCreate(基本模型):
描述:str
authorInfo:AuthorInfoCreate

对于那些知道如何初始化Pydantic类的人,答案是@SKhalymon

从键入导入列表,Dict
从pydantic导入BaseModel
类AuthorBookDetails(基本模型):
书籍数量:int
最佳图书编号:列表[int]
类AuthorInfo创建(BaseModel):
__根目录:Dict[str,AuthorBookDetails]
类ScreenCreate(基本模型):
描述:str
authorInfo:AuthorInfoCreate
kishan=AuthorBookDetails(numberOfBooks=10,bestBookIds=[0,2,3,7])
balram=AuthorBookDetails(numberOfBooks=15,bestBookIds=[10,12,14])
ram=AuthorBookDetails(numberOfBooks=6,BestBookId=[3,5])
aic=AuthorInfoCreate(uuu root_uuuu={“KISHAN”:KISHAN,“BALRAM”:BALRAM,“RAM”:RAM})
sc=ScreenCreate(description=“最佳作者及其作品”,authorInfo=aic)
打印(sc.json())
输出:

{"description": "Best Authors And Their Books", "authorInfo": {"__root__": {"KISHAN": {"numberOfBooks": 10, "bestBookIds": [0, 2, 3, 7]}, "BALRAM": {"numberOfBooks": 15, "bestBookIds": [10, 12, 14]}, "RAM": {"numberOfBooks": 6, "bestBookIds": [3, 5]}}}}

\uuuuuuuuuuuuuuuuuuuuu
仅在父级受支持

这就是为什么不可能使用

class AuthorInfoCreate(BaseModel):
    __root__: Dict[str, AuthorBookDetails]
在上述问题中提出了以下解决方法

现在可以用常规方式使用
AuthorInfoCreate
模型了

aic = AuthorInfoCreate(**{"KISHAN": kishan, "BALRAM": balram, "RAM": ram})

应该不需要上述解决方法。

无法修复的类型错误是由于试图从管道创建一个集合,与pydantic无关。我更改了问题,以查看我到底在寻找什么。我想了解如何更改AuthornFocreate,从而使json模式得到提及。@navule找到解决方案了吗?@SKhalymon还没有。可能是我需要尝试最新的Pydantic文档和线索。谢谢!在Pydantic模型中定义属性时,我误解了类型。
aic = AuthorInfoCreate(**{"KISHAN": kishan, "BALRAM": balram, "RAM": ram})