将相同的字段和方法添加到mongoengine中的EmbededDocument和Document类

时间:2018-05-19 11:57:21

标签: python class oop inheritance mongoengine

我想将时间戳相关字段添加到EmbededDocument类继承的文档和常规的Document类继承的Documents中。

由于EmbededDocument和Document类不能在mongoengine中混合,我必须创建一个基类并尝试通过多继承来使用它。

这就是我所做的

class SikkaBase():
    # Passing a callable as default
    created_on = DateTimeField(default=datetime.now)
    updated_on = DateTimeField(default=datetime.now)
    is_deleted = BooleanField(default=False)

    # Update the updated_on field for every update
    def update(self, *args, **kwargs):
        self.updated_on = datetime.now()

        super(SikkaBase, self).save(*args, **kwargs)

    # Update the created_on field for every updates
    def save(self, *args, **kwargs):
        self.updated_on = datetime.now()

        super(SikkaBase, self).save(*args, **kwargs)


class SikkaBaseDocument(Document, SikkaBase):
    meta = {
        'abstract': True
    }

class SikkaEmbededBaseDocument(EmbeddedDocument, SikkaBase):
    meta = {
        'abstract': True
    }

这会抛出错误

 File ".../sikka_env/lib/python2.7/site-packages/mongoengine/base/metaclasses.py", line 305, in __new__
    if b.__class__ == TopLevelDocumentMetaclass]
AttributeError: class SikkaBase has no attribute '__class__'

我对我的解决方案不太确定,因为SikkaBase类与MongoEngine没有任何关系,也不确定它是多么相关。

寻找任何可能的解决方案。我总是可以在SikkaBaseDocument和SikkaEmbededBaseDocument类中复制相同的代码,但是希望避免这样做。

1 个答案:

答案 0 :(得分:0)

看起来旧式类没有__class__属性,因此您应该从object继承。改变你的第一行

class SikkaBase():

class SikkaBase(object):

应解决此问题。