首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pydantic:检测字段值是否丢失或给定为null

Pydantic:检测字段值是否丢失或给定为null
EN

Stack Overflow用户
提问于 2021-02-16 17:38:12
回答 2查看 22.5K关注 0票数 24

我希望允许用户使用PUT调用有选择地更新字段。关于化脓性模型,我让字段是可选的。在FastAPI处理程序中,如果模型属性为None,则不会给出字段,我也不会更新它。

这种方法的问题是,客户端无法“空出”某个特定类型不需要的字段。

特别是,我希望客户端能够通过在JSON中发送null来清除date字段。如何检测发送null的客户端与根本不发送字段/值的客户端之间的区别?在这两种情况下,模型属性都不是。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-16 19:46:15

脓性文献描述了两个可以与模型的.dict()方法一起使用的选项。

  • exclude_unset:在创建模型时未显式设置的字段是否应排除在返回的字典中;默认为False。在v1.0之前,exclude_unset被称为skip_defaults;现在不再推荐使用skip_defaults
  • exclude_defaults:是否应从返回的字典中排除等于其默认值的字段(无论是set还是其他字段);默认为False

因此,您可以创建具有可选字段的模型类:

代码语言:javascript
运行
复制
from typing import Optional
from pydantic import BaseModel


class MyModel(BaseModel):
    foo: Optional[int] = None
    bar: Optional[int] = None

并且仍然生成一个dict,字段可以明确地设置为None,但是没有默认值:

代码语言:javascript
运行
复制
baz = MyModel(foo=None)
assert baz.dict(exclude_unset=True) == {"foo": None}

baz = MyModel(bar=None)
assert baz.dict(exclude_unset=True) == {"bar": None}
票数 31
EN

Stack Overflow用户

发布于 2021-02-16 19:47:02

您可以检查obj.__fields_set__,以确定该值是否丢失。

代码语言:javascript
运行
复制
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"}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66229384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档