首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python SQL-Alchemy多-多关系

Python SQL-Alchemy多-多关系
EN

Stack Overflow用户
提问于 2018-06-08 06:44:22
回答 1查看 180关注 0票数 0

我想做这样的关系:

所以我的模型是这样定义的:

代码语言:javascript
复制
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'))

我将记录添加到数据库中,如下所示:

代码语言:javascript
复制
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='user1@user.pl', password='user1pass')
user2 = user(name='user2', email='user2@user.pl', password='user2pass')
user3 = user(name='user3', email='user3@user.pl', password='user3pass')
user4 = user(name='user4', email='user4@user.pl', 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])

到目前为止,一切都很好。当我试图将它们联系起来时,问题就出来了,例如:

代码语言:javascript
复制
user1.permissions.append(admin)

结果是:AttributeError: 'user' object has no attribute 'permissions'

我在定义这些模型时犯了什么错误吗?也许backref是错的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 06:56:06

permission类中,通过backrefrole类而不是user类创建一个permissions属性。

代码语言:javascript
复制
costam2 = db.relationship('role', secondary=permission_role, backref=db.backref('permissions', lazy='dynamic'))

应该是

代码语言:javascript
复制
costam2 = db.relationship('user', secondary=permission_role, backref=db.backref('permissions', lazy='dynamic'))

这至少可以修复那个特定的错误

更仔细地看你的图表。也许你想这样做:

代码语言:javascript
复制
role1.permissions.append(admin)

然后在roleuser之间创建关系

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50751120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档