TypeError: 'InstrumentedList' object is not callable while inserting data in many to many relation flask model

Viewed 158

I have defined a many to many relationship between Role and permission table using Role_Permission table as association table.

I want to add data into Role_Permisison table such as 'super_admin_role' has 'add' permission. please note that both super_admin_role and add permission is present to my database. below is how I fetch them but I get TypeError: 'InstrumentedList' object is not callable . how can I insert data such that super_admin_model can have add permission present in permission model.

>>> 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 is a backref defined in Permission Model

Role Model

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 Model

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)
)

Permission Model

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}')"
0 Answers
Related