【问题标题】:Pydantic: Detect if a field value is missing or given as nullPydantic:检测字段值是否缺失或为空
【发布时间】:2021-05-19 14:24:26
【问题描述】:

我希望允许用户使用 PUT 调用选择性地更新字段。在 pydantic 模型上,我已将字段设为可选。在 FastAPI 处理程序中,如果模型属性为 None,则未给出该字段,我不会对其进行更新。

这种方法的问题在于,客户端无法“删除”某些类型不需要的字段。

特别是,我希望客户端能够通过在 JSON 中发送空值来清除这些日期字段。如何检测客户端发送 null 或客户端根本不发送字段/值之间的区别?在任何一种情况下,model 属性都只是 None。

【问题讨论】:

    标签: python pydantic


    【解决方案1】:

    pydantic documentation 描述了两个可与模型的.dict() 方法一起使用的选项。

    • exclude_unset: 创建模型时未明确设置的字段是否应从返回的字典中排除;默认为假。在 v1.0 之前,exclude_unset 被称为 skip_defaults;现在不推荐使用skip_defaults

    • exclude_defaults: 是否应该从返回的字典中排除等于其默认值(无论是否设置)的字段;默认为假

    所以你可以创建一个带有可选字段的模型类:

    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}
    
    

    【讨论】:

      【解决方案2】:

      您可以检查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"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 1970-01-01
        • 2012-02-21
        • 2011-06-29
        • 1970-01-01
        相关资源
        最近更新 更多