Reputation: 1171
I'd like to do relationship like here:
So my models are defined in that way:
role_user = db.Table('role_user',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('role_id', db.Integer, db.ForeignKey('role.id')))
permission_role = db.Table('permission_role',
db.Column('permission_id', db.Integer, db.ForeignKey('permission.id')),
db.Column('role_id', db.Integer, db.ForeignKey('role.id')))
class role(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255))
display_name = db.Column(db.String(255))
description = db.Column(db.String(255))
class permission(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255))
display_name = db.Column(db.String(255))
description = db.Column(db.String(255))
costam2 = db.relationship('role', secondary=permission_role, backref=db.backref('permissions', lazy='dynamic'))
class user(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255))
email = db.Column(db.String(255))
password = db.Column(db.String(255))
costam1 = db.relationship('role', secondary=role_user, backref=db.backref('users', lazy='dynamic'))
I'm adding record to db like this:
admin = permission(name='admin', display_name='Admin', description='Admin')
operator = permission(name='operator', display_name='Operator', description='Operator')
ordinary_user = permission(name='ordinary_user', display_name='Ordinary user', description='Ordinary user')
db.session.add_all([admin, operator, ordinary_user])
user1 = user(name='user1', email='[email protected]', password='user1pass')
user2 = user(name='user2', email='[email protected]', password='user2pass')
user3 = user(name='user3', email='[email protected]', password='user3pass')
user4 = user(name='user4', email='[email protected]', password='user4pass')
db.session.add_all([user1, user2, user3, user4])
role1 = role(name='role1', display_name='role1', description='role1')
role2 = role(name='role2', display_name='role2', description='role2')
role3 = role(name='role3', display_name='role3', description='role3')
role4 = role(name='role4', display_name='role4', description='role4')
db.session.add_all([role1, role2, role3, role4])
And so far everything is okay. Problem is coming out when I try to relate them e.g.:
user1.permissions.append(admin)
The result is: AttributeError: 'user' object has no attribute 'permissions'
Did I make any mistake while defining these models? Maybe backref is wrong?
Upvotes: 0
Views: 273
Reputation: 1744
In your permission
class you create a permissions
attribute via backref
to you role
class, not your user
class.
costam2 = db.relationship('role', secondary=permission_role, backref=db.backref('permissions', lazy='dynamic'))
should be
costam2 = db.relationship('user', secondary=permission_role, backref=db.backref('permissions', lazy='dynamic'))
This will at least fix that specific error
Looking more closely at your diagram. Maybe you want to do something like:
role1.permissions.append(admin)
and then create a relationship between role
and user
Upvotes: 1