Python 基于Mixin的mongoengine文档,使用类装饰器,而不是使用多重继承

Python 基于Mixin的mongoengine文档,使用类装饰器,而不是使用多重继承,python,mongoengine,python-decorators,Python,Mongoengine,Python Decorators,假设我使用Mongoengine创建如下文档: class Tag(Document): name = fields.StringField(required=True, unique=True) user = fields.ReferenceField('User') created = fields.DateTimeField() updated = fields.DateTimeField(default=datetime.datetime.now) cr

假设我使用Mongoengine创建如下文档:

class Tag(Document):
    name = fields.StringField(required=True, unique=True)
    user = fields.ReferenceField('User')
    created = fields.DateTimeField()
    updated = fields.DateTimeField(default=datetime.datetime.now)
created
updated
是其他模型中经常使用的字段,我想将与日期时间相关的内容的代码分离为一个“mixin”。使用多重继承是一种解决方案:

class Tag(Timestampable, Document):
    name = fields.StringField(required=True, unique=True)
    user = fields.ReferenceField('User')

class Timestampable()
    created = fields.DateTimeField()
    updated = fields.DateTimeField(default=datetime.datetime.now)
虽然这是可行的。因此,我们需要另一种解决办法。我想到了班级装饰师:

@Timestampable
class Tag(Document):
    name = fields.StringField(required=True, unique=True)
    user = fields.ReferenceField('User')

def Timestampable(cls)
    cls.created = fields.DateTimeField()
    cls.updated = fields.DateTimeField(default=datetime.datetime.now)
    return cls
这很酷,因为我不需要为任何
super
调用而烦恼

但它不起作用。引用
标记时,不会同时创建
datetime字段
s。

我的问题有什么解决办法吗

附录 为了正确理解这一点,以下是时间标记装饰器的完整混合代码:

def Timestampable(cls):
    cls.created = model_fields.DateTimeField()
    cls.updated = model_fields.DateTimeField(default=datetime.datetime.now)

    cls_save = cls.save
    def save(self, *args, **kwargs):
        now = datetime.datetime.now()
        if not self.id:
            self.created = now
        self.updated = now
        return cls_save(self, *args, **kwargs)
    cls.save = save

    return cls