Flask-SQLAlchemy:具有生成属性的声明性模型

时间:2018-07-23 12:51:26

标签: python sqlalchemy flask-sqlalchemy

我有一个代表报告的类,其中包含相当长的检查和相关注释列表,看起来像这样:

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之间的元类冲突,因此这当然不起作用。 可以做类似的事情吗?

0 个答案:

没有答案