python - 装饰类中的静态方法以记录 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'
。有谁知道如何正确实现这个装饰器以将所有调用转发到装饰类?
提前非常感谢!
解决方案
推荐阅读
- c# - WPF InitializeComponent 无法识别
- string - 字符串词库:因为很多不同的起始字符,需要用不等于逻辑的Split
- android - 不使用 Firebase 的简单颤振应用在启动时会出现 Firebase 错误
- python - 尝试将我的 keras 模型导出到 tensorflow 服务时出现错误
- c# - C#:与内联代码相比,这如何通过多个函数更快地执行?
- jenkins - SonarQube 扫描仪在 Jenkins 作业中执行后未将结果发送到 SonarQube
- php - 如何使用summernote通过ajax同时传递内容和图片
- html - 在不使用类或 ID 的情况下选择 div 中的 div
- c# - 使用 Firebase 数据库处理事务和数组
- shell - 数组每次都应该传递一个值,这里传递所有值