Python 基于Mixin的mongoengine文档,使用类装饰器,而不是使用多重继承
假设我使用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
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