我有一个模型,它接受一些输入,包括sourceSiteId。这是一个整数,但也有许多值作为None
。我已经尝试了一些关于模型的事情,但当值为None
时,仍然收到value is not a valid integer (type=type_error.integer)
的错误。下面是我的模型。
class LatLongModel(BaseModel):
# id: str
object_id: Optional[int] = None
primo_id: Optional[int] = None
name: Optional[str] = None
entity_type: Optional[str] = None
division_id: Optional[int] = None
division: Optional[str] = None
status: Optional[str] = None
longitude: Optional[float] = None
latitude: Optional[float] = None
site_id: Optional[int] = None
source_site_id: Optional[int] = None
site_type: Optional[str] = None
我也试过做source_site_id: int = None
和source_site_id: Optional[int]
,但没有成功。我可以尝试什么让这个模型接受整数以及source_site_id的None类型?
在某些背景下,字段类型int
会试图将None
的值(或您传入的任何值(强制为int
。您可以通过包含自定义验证器来覆盖此行为:
from typing import Optional
from pydantic import BaseModel, validator
class LatLongModel(BaseModel):
# id: str
object_id: Optional[int] = None
primo_id: Optional[int] = None
name: Optional[str] = None
entity_type: Optional[str] = None
division_id: Optional[int] = None
division: Optional[str] = None
status: Optional[str] = None
longitude: Optional[float] = None
latitude: Optional[float] = None
site_id: Optional[int] = None
source_site_id: Optional[int] = None
site_type: Optional[str] = None
# Custom validator here
@validator('site_id', 'source_site_id', pre=True)
def allow_none(cls, v):
if v is None:
return None
else:
return v
您可以尝试通过在模型中定义__new__
方法来找到问题。它可能会帮助您捕获有问题的值(空字符串或其他东西(:
class LatLongModel(BaseModel):
def __new__(cls, *args, **kwargs):
for k,v in kwargs.items():
print(f"'{k}' : {v.__repr__()} ({type(v)})")
return super().__new__(cls)
# [...]
source_site_id: Optional[int] = None
l = LatLongModel(source_site_id="")
> 'source_site_id' : '' (<class 'str'>)
> Stacktrace [...] pydantic.error_wrappers.ValidationError: 1 validation error for LatLongModel
source_site_id
value is not a valid integer (type=type_error.integer)