要求模型字段具有特定约定的 Flask 扩展

Flask extensions requiring models fields to have a particular convention

所以我正在使用 Flask 开发一个网络应用程序。我在我的数据模型中遵循了一个命名约定,但似乎这个约定没有正确地与 Flask 扩展很好地集成以用于特定字段命名,例如引用来自 Flask-Security extension

Models

Flask-Security assumes you’ll be using libraries such as SQLAlchemy, MongoEngine, Peewee or PonyORM to define a data model that includes a User and Role model. The fields on your models must follow a particular convention depending on the functionality your app requires. Aside from this, you’re free to add any additional fields to your model(s) if you want. At the bare minimum your User and Role model should include the following fields:

User

id
email
password
active

...

现在假设我的用户模型是这样的:

class User(UserMixin, db.Model):
    '''This model represents all types of Users registered'''

    __tablename__ = 'users'


    user_id            = db.Column(db.Integer, primary_key=True)
    user_email         = db.Column(db.String(64), unique=True, index=True)
    user_password_hash = db.Column(db.String(128))

如果我必须将模型的字段更改为 Flask 扩展所需的字段,那需要我更改很多文件,这是一项繁琐的任务。

我想到的是这样的:

class User(UserMixin, db.Model):
    '''This model represents all types of Users registered'''

    __tablename__ = 'users'


    user_id            = db.Column(db.Integer, primary_key=True)
    id                 = self.user_id #For Flask-Extensions

    user_email         = db.Column(db.String(64), unique=True, index=True)
    email              = self.user_email #For Flask-Extensions

    user_password_hash = db.Column(db.String(128))
    password           = self.user_password_hash #For Flask-Extensions

这个解决方案有多糟糕,我有哪些替代方案?

这或多或少是可行的,而且我已经完成了。我建议使用 属性:

来实现它
@property
def id(self):
    return self.user_id

如果 Flask-Security 也需要在 class 级别访问 属性,您可以改用 SQLAlchemy 的 hybrid_property

我想你可以使用 Synonyms

I didn't check but I think this should works.

from sqlalchemy.orm import synonym


class User(UserMixin, db.Model):
    __tablename__ = 'users'

    user_id            = db.Column(db.Integer, primary_key=True)
    id                 = synonym('user_id')

    user_email         = db.Column(db.String(64), unique=True, index=True)
    email              = synonym('user_email')

    user_password_hash = db.Column(db.String(128))
    password           = synonym('user_password_hash')