繁体   English   中英

如何使用 Flask-SQLAlchemy 在两个表之间创建多对多关系

[英]How to create many to many relationship between two tables using Flask-SQLAlchemy

我有用户和论坛表。 用户在许多论坛中做出了贡献,并且论坛有许多用户

我的数据库表

users
+----+------------+
| id |    name    |
+----+------------+
|  1 | user_one   |
|  2 | user_two   |
|  3 | user_three |
+----+------------+ 
forums
+----+--------+
| id |  name  |
+----+--------+
|  1 | forum1 |
|  2 | forum2 |
|  3 | forum3 |
+----+--------+
users_forums
+---------+----------+
| user_id | forum_id |
+---------+----------+
|       1 |        1 |
|       1 |        3 |
|       3 |        2 |
|       2 |        1 |
+---------+----------+

在您的 SQLAlchemy UserModel 中,您需要使用如下关系:

    forum_id = db.Column(db.Integer, db.ForeignKey("forum.id"), nullable=False)
    forum = db.relationship("ForumModel")

然后在您的 ForumModel 中,您将它们链接到以下内容:

    users = db.relationship("UserModel", lazy="dynamic")

在这里阅读更多https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/#many-to-many-relationships

参考 - https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#many-to-many

您可以创建UserForum模型或users_forums表来传递关系中的辅助选项。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship

db = SQLAlchemy()

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

    forums = relationship("Forum", secondary='users_forums')

class Forum(db.Model):
    __tablename__ = 'forums'
    id = Column(Integer, primary_key=True)
    name = Column(String(24))

    users = relationship("User", secondary='users_forums')

class UserForum(db.Model):
    __tablename__ = 'users_forums'
    user_id = Column(Integer, ForeignKey('users.id'))
    forum_id = Column(Integer, ForeignKey('forums.id'))

使用如下

user = User.query.get(1)
print(user)
<User 1>

forums = user.forums
print(forums)
[<Forum 1>, <Forum 2>]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM