首页 > 解决方案 > 装饰类中的静态方法以记录 ORM 访问

问题描述

所以我遇到了以下问题。我正在构建一个带有 mongoDB 数据库作为后端的烧瓶应用程序。现在我想在我的数据存储中记录对任何模型的所有更改。因此,我开始为我的数据库模型类开发一些注释。但是,我正在努力正确装饰mongoengine.Document.

我有一个Entry看起来像这样的类:

from somewhere import db
from Logger import EntitiesLogger

@EntitiesLogger
class Entry(db.Document):
   text = db.StringField()
   resource = db.ReferenceField(Resource)
   meta = {'allow_inheritance': True)

我的装饰器类看起来像这样(我添加了一些打印用于调试目的):

def EntitiesLogger(Cls):
    class NewCls(object):
        def __init__(self, *args, **kwargs):
            self.oInstance = Cls(*args, **kwargs)
        def __getattribute__(self, attr):
            try:
                x = super(NewCls, self).__getattribute__(attr)
            except AttributeError:
                print('ERROR')
            else:
                return x
            x = self.oInstance.__getattribute__(attr)
            if type(x) == type(self.__init__):
                print('Data changed')
                return x
            else:
                return x
        def __get__(self, instance, owner):
            print('static method called')

    return NewCls

我现在可以很容易地调用entry = Entry(...)并且装饰器工作。当我访问这样的db.document类的功能时entry.save()也可以。只有当我访问db.document或更具体地说是我的Entry类的描述符时,我才会遇到问题,例如Entry.objects(field='something'). 不知何故,我需要将调用转发给静态方法,如.objects(...)装饰类,但即使实现__get__(...)它也无法正常工作。我总是收到AttributeError: type object 'NewCls' has no attribute 'objects'。有谁知道如何正确实现这个装饰器以将所有调用转发到装饰类?

提前非常感谢!

标签: pythonpython-3.xflaskormdecorator

解决方案


推荐阅读