我想为我的PYDANIC模型自动生成一个ID字段,并且我不想允许调用者提供他们自己的ID值.我try 了使用Field函数的各种方法,但ID字段在初始值设定项中仍然是可选的.

class MyModel(BaseModel):
    item_id: str = Field(default_factory=id_generator, init_var=False, frozen=True)

我也try 使用PrivateAttr而不是Field,但当我呼叫model_dump时,ID字段不显示.

这似乎是一个非常常见和简单的用例,但我在文档中找不到任何关于如何实现这一点的内容.

推荐答案

使用PrivateAttr字段和computed_field属性的组合:

from uuid import uuid4
from pydantic import BaseModel, PrivateAttr, computed_field


class MyModel(BaseModel):
    _id: str = PrivateAttr(default_factory=lambda: str(uuid4()))

    @computed_field
    @property
    def item_id(self) -> str:
        return self._id


print(MyModel().model_dump())

Python相关问答推荐

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

如何记录脚本输出

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

如何过滤包含2个指定子字符串的收件箱列名?

DataFrames与NaN的条件乘法

将9个3x3矩阵按特定顺序排列成9x9矩阵

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

递归访问嵌套字典中的元素值

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

在ubuntu上安装dlib时出错

当递归函数的返回值未绑定到变量时,非局部变量不更新:

Django RawSQL注释字段

使用Python和文件进行模糊输出

lityter不让我输入左边的方括号,'

寻找Regex模式返回与我当前函数类似的结果

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

使用SQLAlchemy从多线程Python应用程序在postgr中插入多行的最佳方法是什么?'

Python:从目录内的文件导入目录

用由数据帧的相应元素形成的列表的函数来替换列的行中的值