簡體   English   中英

Python pydantic model 傳遞 None 作為 int 值不是有效的 integer (type=type_error.integer)

[英]Python pydantic model passing None as int value is not a valid integer (type=type_error.integer)

我有一個 model 需要一些輸入,包括 sourceSiteId。 這是一個 integer 但也有許多值為None 我已經用 model 嘗試了一些事情,但是當值為None時仍然收到value is not a valid integer (type=type_error.integer)錯誤。 下面是我的 model。

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 = Nonesource_site_id: Optional[int]但沒有運氣。 我可以嘗試什么讓這個 model 接受整數以及 source_site_id 的 None 類型?

您可以嘗試通過在 model 中定義__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)

在某些背景下,字段類型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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM