Ошибка типа: объект ‘InstrumentedList’ не вызывается при вставке данных в модель flask отношения многие ко многим

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

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

Я хочу добавить данные в таблицу Role_Permisison, например, у ‘super_admin_role’ есть разрешение ‘добавить’. пожалуйста, обратите внимание, что в моей базе данных присутствуют как super_admin_role, так и разрешение add. ниже показано, как я их извлекаю, но я получаю ошибку типа: объект ‘InstrumentedList’ нельзя вызвать. как я могу вставить данные так, чтобы super_admin_model мог иметь разрешение add, присутствующее в модели разрешений.

 >>> from model import *
>>> permissions = [per for per in Permission.query.all()]
>>> add= permissions[0]
>>> print(add)
Permission('add')
>>> print(type(add))
<class 'model.Permission'>
>>> super_admin_role = Role.query.filter_by(role_name='Super Admin').first()
>>> print(super_admin_role)
ROle('4',Super Admin')
>>> super_admin_role.add_permission(add)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'InstrumentedList' object is not callable
>>>
  

add_permission — это обратная ссылка, определенная в модели разрешений

Образец для подражания

 class Role(db.Model):
    __tablename__ = 'role'
    user = db.relationship('User' ,uselist=False)

    id = db.Column(db.Integer, primary_key=True ,autoincrement=True)
    role_name = db.Column(db.String(100), nullable=False , unique=True)

    
    def __repr__(self):
        return f"ROle('{self.id}',{self.role_name}')"
  

Модель Role_Permisison

 role_permission = db.Table('Role_Permission', 
    db.Column('id',db.Integer, primary_key=True , autoincrement=True),
    
    db.Column('roleName' , db.Integer, db.ForeignKey('role.id') , nullable = False),
    db.Column('permissionName' , db.Integer, db.ForeignKey('permission.id') , nullable = False)
)
  

Модель разрешений

 class Permission(db.Model):
    __tablename__ = 'permission'
    id = db.Column(db.Integer, primary_key=True , autoincrement=True)
    permission_name = db.Column(db.String(100), nullable=False , unique=True)

    permission = db.relationship('Role' , secondary=role_permission , backref= db.backref('add_permission', lazy = True)  )

    def __repr__(self):
        return f"Permission('{self.permission_name}')"