gpt4 book ai didi

python - SQLAlchemy lazy=dynamic 与 m2m 关系使用关联对象模式

转载 作者:行者123 更新时间:2023-11-28 17:38:12 27 4
gpt4 key购买 nike

我在 usersroles 表之间有一个简单的 m2m 关系:

users_roles = db.Table('users_roles',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('role_id', db.Integer, db.ForeignKey('roles.id')),
db.Column('is_primary', db.Boolean)
)

class User(db.Model):
__tablename__ = 'users'
id = db.Column('id', db.Integer, primary_key=True)
roles = db.relationship('Role', secondary=users_roles, lazy='dynamic', backref=db.backref('users', lazy='dynamic'))

class Role(db.Model):
__tablename__ = 'roles'
id = db.Column('id', db.Integer, primary_key=True)
users = db.relationship('User', secondary=users_roles, lazy='dynamic', backref=db.backref('roles', lazy='dynamic'))

要向 users_roles 表添加记录,我必须执行如下操作:

role = Role.get(1)
user = User()
user.roles.append(role)
db.session.add(user)
db.session.commit()

没关系,但我在 users_roles 表中有一个名为 is_primary 的列也应该被填充。

我更改了我的代码以使用 Association Object Pattern如 SQLAlchemy 文档中所述。

现在我的代码是这样的:

class User(db.Model):
__tablename__ = 'users'
id = db.Column('id', db.Integer, primary_key=True)

class Role(db.Model):
__tablename__ = 'roles'
id = db.Column('id', db.Integer, primary_key=True)

class UserRole(db.Model):
__tablename__ = 'users_roles'
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), primary_key=True)
is_primary = db.Column(db.Boolean)

user = db.relationship(User, backref="users_roles")
role = db.relationship(Role, backref="users_roles")

User.roles = association_proxy("users_roles", "role")
Role.users = association_proxy("users_roles", "user")

效果很好,但我还是遇到了问题。User.roles(与关联代理一起添加)是否有可能返回一个AppenderBaseQuery,我可以添加更多过滤器,例如User.query.get(1).roles.filter_by(...)?我习惯于在关系声明中使用 lazy=dynamic 来处理普通的多对多关系,但是在将类映射到关联表之后,我似乎不能再这样做了。有办法实现吗?

@IfLoop 我在这个 post 中听从了你的建议.非常感谢您的帮助。

最佳答案

好吧,我最终使用以下代码过滤了角色:

roles = Role.query.filter_by(...).join(UserRole).join(User).filter_by(id=1)

我仍然希望能够做这样的事情:

roles = User.query.get(1).roles.filter_by(...).all()

无论如何,如果几天后我没有得到答案,我会接受这个作为答案。

关于python - SQLAlchemy lazy=dynamic 与 m2m 关系使用关联对象模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com