小编MDB*_*MDB的帖子

Flask + SQLAlchemy - 自定义元类来修改列设置器(动态混合属性)

我有一个现有的使用 SQLAlchemy 的 Flask 应用程序。这个应用程序中的几个模型/表都有存储原始 HTML 的列,我想在列的 setter 上注入一个函数,以便传入的原始 html 被“清理”。我想在模型中执行此操作,因此我不必在整个表单或路由代码中添加“清理此数据”。

我目前已经可以这样做:

from application import db, clean_the_data
from sqlalchemy.ext.hybrid import hybrid_property
class Example(db.Model):
  __tablename__ = 'example'

  normal_column = db.Column(db.Integer,
                            primary_key=True,
                            autoincrement=True)

  _html_column = db.Column('html_column', db.Text,
                           nullable=False)

  @hybrid_property
  def html_column(self):
    return self._html_column

  @html_column.setter
  def html_column(self, value):
    self._html_column = clean_the_data(value)
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力 - 除了模型定义之外,_html_column 名称从未出现过,调用了更清洁的函数,并使用了清洁后的数据。万岁。

我当然可以停在那里,只吃列的丑陋处理,但是当您可以弄乱元类时为什么要这样做呢?

注意:以下都假设“application”是主要的 Flask 模块,并且它包含两个子项:“db”——SQLAlchemy 句柄和“clean_the_data”——清理传入 HTML 的函数。

因此,我开始尝试创建一个新的基本 Model 类,该类在创建类时发现需要清理的列,并自动处理各种事情,因此您可以执行以下操作,而不是上面的代码:

from application import db
class Example(db.Model):
  __tablename__ = 'example'
  __html_columns__ = ['html_column'] # Our oh-so-subtle hint

  normal_column …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy metaclass flask flask-sqlalchemy

3
推荐指数
1
解决办法
1230
查看次数

标签 统计

flask ×1

flask-sqlalchemy ×1

metaclass ×1

python ×1

sqlalchemy ×1