微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用pyantic创建带有uuid的孩子

如何解决如何用pyantic创建带有uuid的孩子

我尝试创建Foo的子代,每个子代都有自己的uuid。在实际代码中,不会仅创建Foo的子级来创建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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。