簡體   English   中英

Pydantic:檢測字段值是否缺失或作為 null

[英]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.

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