如何使用flask sqlalchemy实现多对多关系?

问题描述 投票:0回答:1

我对

flask-sqlalchemy
很陌生,尤其是在关系模型方面。多对多关系模型的概念是什么?我的示例用例是单个用户可以有多个组,组可以有多个用户。正确的关系是“多对多”吗?如果不是,那么在此用例中什么类型的关系才有意义? 我已经四处搜索,但我不完全理解这个概念和实现。预先感谢:-)

python sqlalchemy
1个回答
3
投票

是的,在您的场景中这被认为是多对多关系。例如,考虑一个具有用户和组的数据库。可以说,一个用户有多个组,一个组有多个用户。这就像双方重叠的一对多关系。这实际上在关系数据库中表示并不简单,并且不能通过简单地将外键添加到现有表来完成。为了适应这种情况,您需要一个额外的表作为中间/辅助表,其中存储两个表的主键。

这是使用 Flask-Sqlalchemy 的实现:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////tmp/test.db"
db = SQLAlchemy(app)

# act as auxiliary table for user and group table
user_groups = db.Table(
    "user_groups",
    db.Column("user_id", db.Integer, db.ForeignKey("user.id")),
    db.Column("group_id", db.Integer, db.ForeignKey("group.id")),
)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    groups = db.relationship("Group", secondary=user_groups, back_populates="users")


class Group(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    users = db.relationship("User", secondary=user_groups, back_populates="groups")

更多参考: https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html 如何使用 SQLAlchemy 构建多对多关系:一个很好的例子

© www.soinside.com 2019 - 2024. All rights reserved.