#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}')"