Flask-SQLAlchemy 设置关系默认值
Flask-SQLAlchemy set relationship default value
我有一个由 Flask 制作的应用程序,我使用 Flask-admin 和 Flask-SQLAlchemy 进行数据库管理。
在我的应用程序中有三个角色,即:
- admin,
- 学校
- parent
这是我 table:
上的代码片段
roles_users = db.Table(
'roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
class School(User):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
class Parent(User):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
school_id = db.Column(db.Integer, db.ForeignKey('school.id'))
代码已经可以正常工作了。
- admin 可以创建学校帐号并设置用户角色为 school.
- 并且具有 school 角色的用户可以创建 parents 帐户。
我可以使用 Flask-admin 界面手动设置所有用户的角色,我可以使用具有 admin 角色的用户来设置。
但是,对于具有 school 角色的用户,我不会像 admin 那样授予设置角色的权限。
我想要的是当具有school角色的用户创建一个帐户时,它会自动将角色设置为parent.
在我的 ModelView 中,我尝试使用以下代码插入它:
class ParentModelView(sqla.ModelView):
def on_model_change(self, form, model, is_created):
if is_created:
model.school_id = current_user.id
model.roles = 'parent'
然后我得到这个错误:
TypeError: Incompatible collection type: str is not list-like
然后我尝试用列表包装它:
def on_model_change(self, form, model, is_created):
if is_created:
model.school_id = current_user.id
model.roles = ['parent']
那么错误是这样的:
AttributeError: 'str' object has no attribute '_sa_instance_state'
当我尝试在关系列上设置默认值时:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'),
default='parent') # or default=3 (which is '3' is the parent id in roles_user association table.
然后我得到这个错误:
TypeError: relationship() got an unexpected keyword argument 'default'
所以,我想要的是在定义角色用户的关系列上设置默认值。
任何帮助将不胜感激。
在您的代码中,当您应该分配 Role
个实例的列表时,您试图分配字符串 'parent'。
在您的 on_model_change
方法中,您需要从数据库中获取名称为 'Parent' 的角色,然后将其作为列表分配给角色关系。
示例(未测试)
def on_model_change(self, form, model, is_created):
if is_created:
# find the role with name 'Parent'
_parent_role = Role.query.filter(Role.name == 'Parent').first()
if _parent_role:
model.school_id = current_user.id
model.roles = [_parent_role]
我有一个由 Flask 制作的应用程序,我使用 Flask-admin 和 Flask-SQLAlchemy 进行数据库管理。 在我的应用程序中有三个角色,即:
- admin,
- 学校
- parent
这是我 table:
上的代码片段roles_users = db.Table(
'roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
class School(User):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
class Parent(User):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
school_id = db.Column(db.Integer, db.ForeignKey('school.id'))
代码已经可以正常工作了。
- admin 可以创建学校帐号并设置用户角色为 school.
- 并且具有 school 角色的用户可以创建 parents 帐户。
我可以使用 Flask-admin 界面手动设置所有用户的角色,我可以使用具有 admin 角色的用户来设置。
但是,对于具有 school 角色的用户,我不会像 admin 那样授予设置角色的权限。
我想要的是当具有school角色的用户创建一个帐户时,它会自动将角色设置为parent.
在我的 ModelView 中,我尝试使用以下代码插入它:
class ParentModelView(sqla.ModelView):
def on_model_change(self, form, model, is_created):
if is_created:
model.school_id = current_user.id
model.roles = 'parent'
然后我得到这个错误:
TypeError: Incompatible collection type: str is not list-like
然后我尝试用列表包装它:
def on_model_change(self, form, model, is_created):
if is_created:
model.school_id = current_user.id
model.roles = ['parent']
那么错误是这样的:
AttributeError: 'str' object has no attribute '_sa_instance_state'
当我尝试在关系列上设置默认值时:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'),
default='parent') # or default=3 (which is '3' is the parent id in roles_user association table.
然后我得到这个错误:
TypeError: relationship() got an unexpected keyword argument 'default'
所以,我想要的是在定义角色用户的关系列上设置默认值。
任何帮助将不胜感激。
在您的代码中,当您应该分配 Role
个实例的列表时,您试图分配字符串 'parent'。
在您的 on_model_change
方法中,您需要从数据库中获取名称为 'Parent' 的角色,然后将其作为列表分配给角色关系。
示例(未测试)
def on_model_change(self, form, model, is_created):
if is_created:
# find the role with name 'Parent'
_parent_role = Role.query.filter(Role.name == 'Parent').first()
if _parent_role:
model.school_id = current_user.id
model.roles = [_parent_role]