【问题标题】:Flask-SQLAlchemy set relationship default valueFlask-SQLAlchemy 设置关系默认值
【发布时间】:2019-06-21 14:45:22
【问题描述】:

我有一个由 Flask 制作的应用程序,我使用 Flask-admin 和 Flask-SQLAlchemy 进行数据库管理。 在我的应用中,有三个角色,即:

  1. 管理员
  2. 学校
  3. 父母

这是我桌子上的代码片段:

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
  • 拥有学校角色的用户可以创建家长帐户。

我可以使用 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'

所以,我想要的是在定义角色用户的关系列上设置一个默认值。

任何帮助将不胜感激。

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-login flask-admin


    【解决方案1】:

    在您的代码中,当您应该分配 Role 实例列表时,您尝试分配字符串“父级”。

    在您的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]
    

    【讨论】:

    • 谢谢,你真的又节省了我的时间:)
    猜你喜欢
    • 2016-11-10
    • 2018-05-23
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2016-12-22
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多