Python Flask SQLAlchemy设置关系默认值

Python Flask SQLAlchemy设置关系默认值,python,flask,flask-sqlalchemy,flask-login,flask-admin,Python,Flask,Flask Sqlalchemy,Flask Login,Flask Admin,我有一个由Flask制作的应用程序,对于数据库管理,我使用Flask admin和Flask SQLAlchemy。 在我的应用程序中有三个角色,即: 管理 学校 家长 下面是我桌上的代码片段: roles_users = db.Table( 'roles_users', db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), db.Column('role_id', db.Integer(), db.F

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

  • 管理
  • 学校
  • 家长
  • 下面是我桌上的代码片段:

    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'))
    
    代码已经可以正常工作了

    • 管理员可以创建学校帐户,并将用户角色设置为学校
    • 拥有学校角色的用户可以创建家长帐户
    我可以使用Flask admin界面为所有用户手动设置角色,我可以使用具有admin角色的用户设置角色

    但是,对于拥有school角色的用户,我不会像admin那样授予设置角色的权限

    我想要的是,当拥有学校角色的用户创建帐户时,它会自动将角色设置为家长

    在我的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
    
    TypeError: relationship() got an unexpected keyword argument 'default'
    
    然后我试着用列表来包装它:

       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: Incompatible collection type: str is not list-like
    
    TypeError: relationship() got an unexpected keyword argument 'default'
    
    因此,我想要的是在定义用户角色的关系列上设置一个默认值


    任何帮助都将不胜感激。

    在您的代码中,当您应该分配
    角色
    实例列表时,您正试图分配字符串“parent”

    在您的
    on\u model\u change
    方法中,您需要从数据库中获取名为“Parent”的角色,然后将其作为列表分配给角色关系

    示例(未测试)


    谢谢,你真的又节省了我的时间:)