我从 Typescript 中知道了一个概念,称为“受歧视的联合”。这是你放置 2 个结构体(类等)的地方,并且类型是根据结构体的值决定的。我正在尝试通过Pydantic验证在FastAPI中实现类似的目标。我可以收到两种不同的请求负载。是其中之一还是另一个取决于变量。如果是,则应由 验证,如果是,则应由 验证。我该如何实现这一目标?找不到任何其他解决方案。accountTypecreativeRegistrationPayloadCreativebrandRegistrationPayloadBrand
问题是它要么返回
unexpected value; permitted: 'creative' (type=value_error.const; given=brand; permitted=('creative',))
或者它根本不起作用。
class RegistrationPayloadBase(BaseModel):
first_name: str
last_name: str
email: str
password: str
class RegistrationPayloadCreative(RegistrationPayloadBase):
accountType: Literal['creative']
class RegistrationPayloadBrand(RegistrationPayloadBase):
company: str
phone: str
vat: str
accountType: Literal['brand']
class A(BaseModel):
b: Union[RegistrationPayloadBrand, RegistrationPayloadCreative]
def main():
A(b={'first_name': 'sdf', 'last_name': 'sdf', 'email': 'sdf', 'password': 'sdfds', 'accountType': 'brand'})
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 我有一个连接到 MongoDB 的多语言 FastAPI。我在 MongoDB 中的文档以两种可用语言复制,并以这种方式构建(简化示例):
\n\n{\n "_id": xxxxxxx,\n "en": { \n "title": "Drinking Water Composition",\n "description": "Drinking water composition expressed in... with pesticides.",\n "category": "Water", \n "tags": ["water","pesticides"] \n },\n "fr": { \n "title": "Composition de l\'eau de boisson",\n "description": "Composition de l\'eau de boisson exprim\xc3\xa9e en... pr\xc3\xa9sence de pesticides....",\n "category": "Eau", \n "tags": ["eau","pesticides"] \n }, \n}\n\nRun Code Online (Sandbox Code Playgroud)\n因此,我实现了两个模型DatasetFR和,每个模型都对每种语言中的特定外部模型 ( )DatasetEN进行引用。Enumcategorytags
class DatasetFR(BaseModel):\n title:str\n description: str\n category: CategoryFR\n tags: …Run Code Online (Sandbox Code Playgroud) 我需要一个covars包含未知数量条目的变量,其中每个条目都是三个不同的自定义模型之一Pydantic。在本例中,每个条目都描述了我的应用程序的一个变量。
具体来说,我想要covars以下形式。这里显示了三个条目,即variable1、variable2和variable3,代表三种不同类型的条目。但是,在部署时,应用程序必须允许接收三个以上的条目,并且并非所有条目类型都需要出现在请求中。
covars = {
'variable1': # type: integer
{
'guess': 1,
'min': 0,
'max': 2,
},
'variable2': # type: continuous
{
'guess': 12.2,
'min': -3.4,
'max': 30.8,
},
'variable3': # type: categorical
{
'guess': 'red',
'options': {'red', 'blue', 'green'},
}
}
Run Code Online (Sandbox Code Playgroud)
我已成功创建三种不同的条目类型作为三个单独的Pydantic模型
import pydantic
from typing import Set, Dict, Union
class IntVariable(pydantic.BaseModel):
guess: int
min: int
max: int
class ContVariable(pydantic.BaseModel):
guess: float
min: float
max: …Run Code Online (Sandbox Code Playgroud) 我有一个MessageModel版本号为 的Pydantic 模型类Literal。现在我们的需求发生了变化,我们需要另一个MessageModel具有更高版本号的版本,因为 的属性MessageModel已经发生了变化。我想要一个类,我可以在其中将版本号作为构造函数的参数。有人有想法吗?
以下是型号:
from typing import Literal
from pydantic import BaseModel
class MessageModelV1(BaseModel):
version: Literal[1]
bar: str
class MessageModelV2(BaseModel):
version: Literal[2]
foo: str
Run Code Online (Sandbox Code Playgroud)
我想要的是一个初始化正确MessageModel版本的类:
model = MessageModel(version=2, ...)
Run Code Online (Sandbox Code Playgroud)