所以我正在使用Flask开发webapp。我在我的数据模型中遵循了一个命名约定,但似乎这个约定没有与特定字段命名的Flask扩展很好地集成,例如引自Flask-Security extension
模型
Flask-Security假设您将使用SQLAlchemy等库, MongoEngine,Peewee或PonyORM定义了一个包含a的数据模型 用户和角色模型。 模型上的字段必须遵循a 特殊约定取决于您的应用程序的功能 需要即可。除此之外,您还可以自由添加任何其他字段 你想要的模型。至少是您的用户和角色 模型应包括以下字段:
用户
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-extension所需的字段,则需要我更改大量文件,这是一项繁琐的任务。
我想到的是这样的:
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
这个解决方案有多糟糕,我有什么替代方案?
答案 0 :(得分: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')
答案 1 :(得分:1)
这或多或少可行,我做过的事情。我建议使用属性来实现它:
@property
def id(self):
return self.user_id
如果Flask-Security也需要在类级别访问该属性,则可以使用SQLAlchemy的hybrid_property
代替。