python - 如何使用 pydantic 创建具有 uuid 的子级
问题描述
我尝试创建 Foo 的孩子,每个孩子都应该有自己的 uuid。在实际代码中,不会创建 Foo 的实例,只有它的子级。孩子稍后将保存在数据库中,uuid 用于从数据库中检索正确的对象。
在第一个代码片段中,我尝试使用 init 方法,这会导致 AttributeError。我还尝试使用类方法,这会导致我的子对象中的所有字段丢失。
如果我的第二个片段每个孩子都获得相同的 uuid,这对我来说很有意义,因为它是作为默认值传递的。
我可以将 uuid 创建放入孩子中,尽管在使用继承时感觉不对。
有没有更好的方法为每个孩子创建一个 uuid?
# foo_init_.py
class Foo(BaseModel):
def __init__(self):
self.id_ = uuid4()
# >>> AttributeError: __fields_set__
# foo_classmethod.py
class Foo(BaseModel):
@classmethod
def __init__(cls):
cls.id_ = uuid4()
# >>> Bar loses id_ fields
from uuid import uuid4, UUID
from pydantic import BaseModel
class Foo(BaseModel):
id_: UUID = uuid4()
class Bar(Foo):
pass
class Spam(Foo):
pass
if __name__ == '__main__':
b1 = Bar()
print(b1.id_) # >>> 73860f46-5606-4912-95d3-4abaa6e1fd2c
b2 = Bar()
print(b2.id_) # >>> 73860f46-5606-4912-95d3-4abaa6e1fd2c
s1 = Spam()
print(s1.id_) # >>> 73860f46-5606-4912-95d3-4abaa6e1fd2c
解决方案
您可以使用default_factory参数:
class Foo(BaseModel):
id_: UUID = Field(default_factory=uuid4)
推荐阅读
- python - CNN 模型只预测 1 类,并且给出 sigmoid 预测总是 0.99-1
- android - 如何修改应用程序图标和应用程序名称以进行 MDM 分发 - 原生应用程序的品牌重塑
- unit-testing - dotnet test Coverlet 错误覆盖
- java - 推荐,将文件存储在内存中并通过电子邮件发送
- powerbi - 防止测量受到视觉过滤器的影响
- python - Python:在 except 块中引发另一个异常以稍后捕获
- bluetooth - 如何选择蓝牙地址
- c# - 如何为底部的每个新条目更新 Listview?
- javascript - 从 Next.js 中的 API 获取数据的问题
- php - 如何在刀片上指定参数以访问表列之间的外键