Python MongoEngine Audit表子类

问题描述

我在Flask API上使用Mongonegine,并且我有一个带有audit的表(带有create_date和update_date的2列)。

当前模型如下:

class ProductModel(db.Document):
    Meta = {'collection': 'product','queryset_class': CustomQuerySet}
    id = db.SequenceField(primary_key=True)
    url = db.StringField(required=True,unique=True)
    name = db.StringField(required=True,default=generate_random_string())
    user_id = db.ReferenceField(usermodel,required=True)
    create_date = db.DateTimeField()
    update_date = db.DateTimeField()
    vendor_id = db.ReferenceField(vendorModel,required=True)
    active = db.IntField(required=True,default=1)
    subscribed_list= db.EmbeddedDocumentListField(SubscribedListDocument)
    price_history = db.EmbeddedDocumentListField(PriceHistoryDocument)
    def to_json(self):
        data = self.to_mongo()
        data["vendor_id"] = {"name" :self.vendor_id.name,"active": self.vendor_id.active}
        data["user_id"] = {"name": self.user_id.name}
        return json_util.dumps(data)
    def save(self,*args,**kwargs):
        if not self.create_date:
            self.create_date = get_current_date()
        self.update_date = get_current_date()
        return super(ProductModel,self).save(*args,**kwargs)

我通过“ 保存方法实现了审计部分。

我计划也对另一个表实施审核,并且我想通过另一个继承的类来实现这一点,因此我不会在每个模型中都复制save方法

class AuditModel(Document):
    Meta = {'allow_inheritance': True}
    create_date = DateTimeField(default=get_current_date)
    update_date = DateTimeField(default=get_current_date)
    # def save(self,**kwargs):
    #     if not self.create_date:
    #         self.create_date = get_current_date()
    #     self.update_date = get_current_date()
    #     print(self.create_date)
    #     return super(self).save(*args,**kwargs)

class ProductModel(db.Document,AuditModel):
......

但是它不起作用。

有什么想法吗?

谢谢。

解决方法

我为此解决了:

https://github.com/MongoEngine/mongoengine/issues/574

现在代码如下:

class AuditModel(Document):
    meta = {'allow_inheritance': True,'abstract': True}
    create_date = DateTimeField(default=get_current_date)
    update_date = DateTimeField(default=get_current_date)
    def save(self,*args,**kwargs):
        if not self.create_date:
            self.create_date = get_current_date()
        self.update_date = get_current_date()
        return super(AuditModel,self).save(*args,**kwargs)


class ProductModel(AuditModel):
    meta = {'collection': 'product','queryset_class': CustomQuerySet}
    id = db.SequenceField(primary_key=True)
    url = db.StringField(required=True,unique=True)
    name = db.StringField(required=True,default=generate_random_string())
    user_id = db.ReferenceField(UserModel,required=True)
    create_date = db.DateTimeField()
    update_date = db.DateTimeField()
    vendor_id = db.ReferenceField(VendorModel,required=True)
    active = db.IntField(required=True,default=1)
    subscribed_list= db.EmbeddedDocumentListField(SubscribedListDocument)
    price_history = db.EmbeddedDocumentListField(PriceHistoryDocument)
    def to_json(self):
        data = self.to_mongo()
        data["vendor_id"] = {"name" :self.vendor_id.name,"active": self.vendor_id.active}
        data["user_id"] = {"name": self.user_id.name}
        return json_util.dumps(data)

我需要在子类上添加{'abstract':True}。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...