Pydantic:导出具有不同编码的相同类型的字段
Pydantic: Export fields of the same type with different encodings
假设我有一个包含各种 timedelta
字段的模型,但我希望它们在导出到 JSON 时分别以不同的格式表示。我知道我可以为 timedelta
指定 JSON 编码器,但这适用于该类型的所有字段。有没有办法为给定字段指定 JSON 编码器?还是有其他方法可以做到这一点?
这里有一些代码作为例子:
from datetime import datetime, timedelta
from pydantic import BaseModel
from pydantic.json import timedelta_isoformat
class Example(BaseModel):
delta_iso: timedelta # export using timedelta_isoformat
delta_seconds_int: timedelta # export as int in seconds
delta_seconds_float: timedelta # export as float in seconds
delta_milliseconds_int: timedelta # export as int in milliseconds
class Config:
# This won't work because it applies to all fields above
json_encoders = {
timedelta: timedelta_isoformat,
}
您可以提供自定义 json_dumps
函数。像这样:
import json
from datetime import datetime, timedelta
from pydantic import BaseModel
from pydantic.json import timedelta_isoformat
def custom_dumps(v, *, default):
for key, value in v.items():
if key == "delta_iso":
v[key] = timedelta_isoformat(value)
elif key == "delta_seconds_int":
v[key] = int(value.total_seconds())
elif key == "delta_seconds_float":
v[key] = value.total_seconds()
elif key == "delta_milliseconds_int":
v[key] = value.total_seconds() * 1000
return json.dumps(v, default=default)
class Example(BaseModel):
delta_iso: timedelta # export using timedelta_isoformat
delta_seconds_int: timedelta # export as int in seconds
delta_seconds_float: timedelta # export as float in seconds
delta_milliseconds_int: timedelta # export as int in milliseconds
class Config:
json_dumps = custom_dumps
diff = datetime.timedelta(milliseconds=5000)
print(Example(delta_iso=diff, delta_seconds_int=diff, delta_seconds_float=diff, delta_milliseconds_int=diff).json())
{"delta_iso": "P0DT0H0M5.000000S", "delta_seconds_int": 5, "delta_seconds_float": 5.0, "delta_milliseconds_int": 5000.0}
假设我有一个包含各种 timedelta
字段的模型,但我希望它们在导出到 JSON 时分别以不同的格式表示。我知道我可以为 timedelta
指定 JSON 编码器,但这适用于该类型的所有字段。有没有办法为给定字段指定 JSON 编码器?还是有其他方法可以做到这一点?
这里有一些代码作为例子:
from datetime import datetime, timedelta
from pydantic import BaseModel
from pydantic.json import timedelta_isoformat
class Example(BaseModel):
delta_iso: timedelta # export using timedelta_isoformat
delta_seconds_int: timedelta # export as int in seconds
delta_seconds_float: timedelta # export as float in seconds
delta_milliseconds_int: timedelta # export as int in milliseconds
class Config:
# This won't work because it applies to all fields above
json_encoders = {
timedelta: timedelta_isoformat,
}
您可以提供自定义 json_dumps
函数。像这样:
import json
from datetime import datetime, timedelta
from pydantic import BaseModel
from pydantic.json import timedelta_isoformat
def custom_dumps(v, *, default):
for key, value in v.items():
if key == "delta_iso":
v[key] = timedelta_isoformat(value)
elif key == "delta_seconds_int":
v[key] = int(value.total_seconds())
elif key == "delta_seconds_float":
v[key] = value.total_seconds()
elif key == "delta_milliseconds_int":
v[key] = value.total_seconds() * 1000
return json.dumps(v, default=default)
class Example(BaseModel):
delta_iso: timedelta # export using timedelta_isoformat
delta_seconds_int: timedelta # export as int in seconds
delta_seconds_float: timedelta # export as float in seconds
delta_milliseconds_int: timedelta # export as int in milliseconds
class Config:
json_dumps = custom_dumps
diff = datetime.timedelta(milliseconds=5000)
print(Example(delta_iso=diff, delta_seconds_int=diff, delta_seconds_float=diff, delta_milliseconds_int=diff).json())
{"delta_iso": "P0DT0H0M5.000000S", "delta_seconds_int": 5, "delta_seconds_float": 5.0, "delta_milliseconds_int": 5000.0}