【问题标题】:Python MongoEngine Audit table child classPython MongoEngine 审计表子类
【发布时间】:2020-08-21 08:00:51
【问题描述】:

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

目前模型如下:

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”方法中实现了审计部分。

我还计划在另一个表上实现审计,我想用另一个继承的类来实现,像这样,所以我不会在每个模型中复制 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, *args, **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):
......

但它不起作用。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: python mongodb flask mongoengine


    【解决方案1】:

    我解决了这个问题:

    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}。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2014-08-11
      • 2011-04-19
      相关资源
      最近更新 更多