我有一个代表报告的类,其中包含相当长的检查和相关注释列表,看起来像这样:
class Report(db.Model):
check_1 = db.Column(db.Boolean, info={'label': 'Check 1'})
check_1_comment = db.Column(db.String, info={'label': 'Check 1 comment'})
check_2 = db.Column(db.Boolean, info={'label': 'Check 2'})
check_2_comment = db.Column(db.String, info={'label': 'Check 2 comment'})
由于属性设置要复杂得多,并且字段会定期更改,因此我想对其进行重构,以从OrderedDict之类的结构中生成属性。
我尝试使用自定义的元类进行某些操作,但是考虑到Flask-SQLAlchemy的对象层次结构,似乎很难正确地进行操作
class ReportMeta(_BoundDeclarativeMeta):
def __new__(cls, *args, **kwargs):
klass = super().__new__(cls, *args, **kwargs)
checks = cls.Meta.checks
for (key, label) in checks.items():
setattr(klass, key, db.Column(db.Boolean, info={'label': label}))
setattr(klass, f'{key_comment}', db.Column(db.Str, info={'label': label}))
class Report(db.Model, metaclass=ReportMeta):
class Meta:
checks = OrderedDict([('check_1', 'Check 1'), ('check_2', 'Check 2')])
由于db.Model和ReportMeta之间的元类冲突,因此这当然不起作用。 可以做类似的事情吗?