У меня есть приложение, созданное Flask, и для управления базами данных я использую Flask-admin и Flask-SQLAlchemy.И в моем приложении есть три роли:
- admin ,
- school
- parent
вот фрагмент кода на моей таблице:
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 может сделать учетную запись родителей.
Я могу установить роль для всех пользователей вручную с помощью интерфейса 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'
Итак, я хочу установить значение по умолчанию для моего столбца отношений, который определяет ролипользователи.
Любая помощь будет высоко ценится.