1

所以我正在使用 Flask 开发一个 webapp。我在我的数据模型中遵循了一个命名约定,但似乎这个约定没有与 Flask-extensions 正确集成以进行特定字段命名,例如引用来自Flask-Security 扩展

楷模

Flask-Security 假设您将使用 SQLAlchemy、MongoEngine、Peewee 或 PonyORM 等库来定义包含用户和角色模型的数据模型。您的模型上的字段必须遵循特定的约定,具体取决于您的应用程序所需的功能。除此之外,您可以根据需要向模型中添加任何其他字段。您的用户和角色模型至少应包含以下字段:

用户

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

这个解决方案有多糟糕,我有什么替代方案?

4

2 回答 2

2

我认为您可以使用Synonyms

我没有检查,但我认为这应该有效。

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')
于 2018-04-14T10:11:51.467 回答
1

这或多或少是可行的,我已经做过。我建议使用属性来实现它:

@property
def id(self):
    return self.user_id

如果 Flask-Security 也需要在类级别可访问的属性,则可以使用 SQLAlchemyhybrid_property代替。

于 2018-04-13T14:49:03.137 回答