gpt4 book ai didi

python - 具有附加字段的 SQLAlchemy 多对多辅助表

转载 作者:行者123 更新时间:2023-12-02 14:14:54 25 4
gpt4 key购买 nike

我有 3 个表:用户、社区、community_members(用于许多用户和社区的关系)。

我使用 Flask-SQLAlchemy 创建此表:

community_members = db.Table('community_members',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('community_id', db.Integer, db.ForeignKey('community.id')),
)


class Community(db.Model):
__tablename__ = 'community'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False, unique=True)
members = db.relationship(User, secondary=community_members,
backref=db.backref('community_members', lazy='dynamic'))

现在我想向community_members添加额外的字段,如下所示:

community_members = db.Table('community_members',
db.Column('id', db.Integer, primary_key=True),
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('community_id', db.Integer, db.ForeignKey('community.id')),
db.Column('time_create', db.DateTime, nullable=False, default=func.now()),
)

现在在 python shell 中我可以这样做:

创建社区:

> c = Community()
> c.name = 'c1'
> db.session.add(c)
> db.session.commit()

向社区添加成员:

> u1 = User.query.get(1)
> u2 = User.query.get(2)
> c.members.append(u1)
> c.members.append(u2)
> db.session.commit()

> c.members
[<User 1>, <User 2>]

好的,这有效。

但是现在我如何获取community_members表的time_create?

最佳答案

您必须从使用简单的多对多关系切换到使用“Association Object ”,这基本上只是获取关联表并为其提供适当的类映射。然后,您将定义与用户社区的一对多关系:

class Membership(db.Model):
__tablename__ = 'community_members'

id = db.Column('id', db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
community_id = db.Column(db.Integer, db.ForeignKey('community.id'))
time_create = db.Column(db.DateTime, nullable=False, default=func.now())

community = db.relationship(Community, backref="memberships")
user = db.relationship(User, backref="memberships")


class Community(db.Model):
__tablename__ = 'community'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False, unique=True)

但是您可能只是偶尔对创建时间感兴趣;你想要恢复旧有的关系!好吧,您不想建立两次关系;因为 sqlalchemy 会认为您以某种方式想要两个关联;这一定意味着不同的东西!您可以通过添加 association proxy. 来做到这一点

from sqlalchemy.ext.associationproxy import association_proxy

Community.members = association_proxy("memberships", "user")
User.communities = association_proxy("memberships", "community")

关于python - 具有附加字段的 SQLAlchemy 多对多辅助表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7417906/

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