gpt4 book ai didi

python - 将特定的 pydantic 对象字段设置为 null 时不序列化

转载 作者:行者123 更新时间:2023-12-05 05:52:02 28 4
gpt4 key购买 nike

我有一个包含可选字段的 pydantic 对象定义。我希望能够将该字段配置为仅在它不是 None 时才被序列化。

class MyObject(BaseModel):
id: str
msg: Optional[str] = None
pri: Optional[int] = None

MyObject(id="123").json() # ideal output: {"id": "123", "pri": null}
MyObject(id="123", msg="hello").json() # ideal output: {"id": "123", "msg": "hello", "pri": null}

我希望能够精确指定字段,因为这个对象将被嵌套,并且还有其他可选字段应该返回,无论它们是否为 Nonesolution to set json option exclude_noneTrue 不适用于此目的。

最佳答案

你不能用 pydantic 甚至像 attrs 这样更强大的库来做这样的事情。原因可能是因为它不是返回 json 对象的好方法,它确实让您、api 客户端和您的测试套件感到困惑。

你可能会从elegant-way-to-remove-fields-from-nested-dictionaries中得到一些启发。 .

您可以通过解析您的对象 jsoned 并按照逻辑删除字段来实现某些目标(根本不推荐)。

嵌套字典中的键/值操作示例:

import re

def dict_key_convertor(dictionary):
"""
Convert a dictionary from CamelCase to snake_case
:param dictionary: the dictionary given
:return: return a dict
"""
if not isinstance(dictionary, (dict, list)):
return dictionary

if isinstance(dictionary, list):
return [dict_key_convertor(elem) for elem in dictionary]

return {to_snake(key): dict_key_convertor(data) for key, data in dictionary.items()}


def to_snake(word) -> str:
"""
Convert all word from camel to snake case
:param word: the word given to be change from camelCase to snake_case
:return: return word variable in snake_case
"""
return re.sub(r'([A-Z]{2,}(?=[a-z]))', '\\1_', re.sub(r'([a-z])([A-Z]+)', '\\1_\\2', word)).lower()

通过一些工作,您可能会取得一些成就:

from typing import List


def dict_key_cleaner(dictionary):
if not isinstance(dictionary, (dict, list)):
return dictionary

if isinstance(dictionary, list):
return [dict_key_cleaner(elem) for elem in dictionary]
# change this return to work with dict
return {poper(key, dictionary): dict_key_cleaner(data) for key, data in dictionary.items()}


def poper(key, dictionary):
special_keys: List[str] = ["field_name","field_name1","field_name2"]
# do some stuff here
for spe_key in special_keys:
if key == spe_key and key.key_value is None:
dictionary.pop(key)
# add return of modified dict

关于python - 将特定的 pydantic 对象字段设置为 null 时不序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70287744/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com