【问题标题】:Bson ObjectId generating same value in python dataclass objectsBson ObjectId 在 python 数据类对象中生成相同的值
【发布时间】:2021-01-27 20:38:23
【问题描述】:

我正在尝试为我从数据类创建的对象生成一个唯一的 ObjectId。但是,对于我从班级制作的每个对象,它都会生成相同的 ID。

from dataclasses import dataclass
from bson import ObjectId

@dataclass
class B:
    id: ObjectId=ObjectId()

b =B()
b.id
>>ObjectId('600c9d09c889e41a182988b0')

c =B()
c.id
>>ObjectId('600c9d09c889e41a182988b0')

我不明白这种行为,是不是因为数据类在每次初始化类时都保持相同的默认 objectId 引用?

你有解决方法吗?

【问题讨论】:

    标签: python python-3.x bson objectid


    【解决方案1】:

    由于上述数据类将被启动为:

    class B:
        def __init__(self, x: ObjectId = ObjectId()):
            self.id=x
    

    类的默认值始终是加载类时生成的静态ObjectId。 最后,我认为动态值不应该作为 init 参数传递。

    正确的方法是使用__post_init__:

    from dataclasses import field
    
    @dataclass
    class B:
        id: ObjectId = field(init=False)
    
        def __post_init__(self):
            self.id = ObjectId()
    
    b =B()
    b.id
    >>ObjectId('60104262ee527a385cb44a11')
    
    c =B()
    c.id
    >>ObjectId('6010426bee527a385cb44a12')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多