Flask-SQLAlchemy установить значение отношения по умолчанию - PullRequest
0 голосов
/ 28 января 2019

У меня есть приложение, созданное Flask, и для управления базами данных я использую Flask-admin и Flask-SQLAlchemy.И в моем приложении есть три роли:

  1. admin ,
  2. school
  3. 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'

Итак, я хочу установить значение по умолчанию для моего столбца отношений, который определяет ролипользователи.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 28 января 2019

В вашем коде вы пытаетесь присвоить строку 'parent', когда вам нужно назначить список Role экземпляров.

В вашем методе on_model_change вам нужно получить роль с именем«Родитель» из базы данных, а затем назначить его для отношения ролей в виде списка.

Пример (не проверено)

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]
...