[英]Pydantic nested model field throws value_error.missing
[英]Pydantic: Detect if a field value is missing or given as null
我想允許用戶使用 PUT 調用有選擇地更新字段。 在 pydantic model 上,我已將字段設為可選。 在 FastAPI 處理程序中,如果 model 屬性為“無”,則未給出該字段並且我不更新它。
這種方法的問題是客戶端無法“刪除”某些類型不需要的字段。
特別是,我希望客戶能夠通過在 JSON 中發送 null 來清除日期字段。 如何檢測發送 null 的客戶端或根本不發送字段/值的客戶端之間的區別? 在任何一種情況下,model 屬性都只是 None 。
pydantic 文檔描述了兩個可與模型的.dict()
方法一起使用的選項。
exclude_unset
:是否應從返回的字典中排除在創建 model 時未明確設置的字段; 默認為假。 在 v1.0 之前,exclude_unset 被稱為 skip_defaults; 現在不推薦使用 skip_defaults
exclude_defaults
:是否應從返回的字典中排除等於其默認值(無論是否設置)的字段; 默認假
所以我創建了一個 model class:
from typing import Optional
from pydantic import BaseModel
class MyModel(BaseModel):
foo: Optional[int] = None
bar: Optional[int] = None
baz = MyModel(foo=None)
assert baz.dict(exclude_unset=True) == {"foo": None}
baz = MyModel(bar=None)
assert baz.dict(exclude_unset=True) == {"bar": None}
您可以檢查obj.__fields_set__
以查看該值是否丟失。
from typing import Optional
from pydantic import BaseModel
class Foo(BaseModel):
first: Optional[int] = None
second: Optional[int] = None
foo = Foo.parse_raw('{"first": null}')
assert foo.first is None and foo.second is None
assert foo.__fields_set__ == {"first"}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.