pydantic:如何为字段选择类型?



我有一个FastAPI应用程序,我需要创建一个Car类,其中属性wheelspeed可以接受intstr类型。怎么做呢?这段代码不起作用,因为wheelspeed将只有整数类型(第二次打印时不是str):

from pydantic import BaseModel

class Car(BaseModel):
wheel: int | str
speed: int | str

bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))

结果是:

<class 'int'> <class 'int'>
<class 'int'> <class 'int'>

所以,我个人在这里只使用pydantic.StrictIntpydantic.StricStr(实际上,我几乎在任何地方都使用它们,特别是StrictStr,因为几乎任何对象都可以强制为字符串):

import pydantic

class Car(pydantic.BaseModel):
wheel: pydantic.StrictInt | pydantic.StrictStr
speed: pydantic.StrictInt | pydantic.StrictStr

bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))

这个打印:

<class 'int'> <class 'int'>
<class 'str'> <class 'str'>

型号规格有顺序。对于int | str,如果可能的话,该值将被视为int,否则将被视为str。颠倒str | int的顺序将导致值被视为str(如果可能的话),否则将被视为int。颠倒顺序的问题是,几乎所有内容都可以被视为str,因此bmw值将被强制转换为str。例子:

from pydantic import BaseModel

class Car(BaseModel):
wheel: str | int
speed: str | int

bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
& lt;类str的祝辞& lt;类str的祝辞& lt;类str的祝辞

这里的关键是您需要选择哪种类型优先。