首页 > 解决方案 > 如何基于一对一(三个表)创建一对多关系?

问题描述

我正在学习使用flask和SQLachemy在python上进行后端开发。我已经理解了建立一对一、一对多和多对多关系的方式。而现在我正在尝试建立一种更棘手的关系。

有 3 个模型类,具有这些关系:

现在我想通过 B 关系创建 C 和 A 之间的关系(抽象问题公式,继续阅读具体公式)

文档谈到join,这可能是一种方法,但我无法理解示例 https://docs.sqlalchemy.org/en/13/orm/join_conditions.html#composite-secondary-joins

from backend import db # db = SQLAlchemy(app)
class User(db.Model): # class A
    __tablename__ = 'User'
    id = db.Column(db.Integer, primary_key=True)
    # ...
    albums = db.relationship('Album', backref='auteur')
    # pictures taken as a photograph (pictures_posted may exist, but
    # that's still the same difficulty than with photographer, "circular"
    # relationships
    pictures_taken = db.relationship('Picture', backref='photographe')
class Picture(db.Model): # class B
    __tablename__ = 'Picture'
    id = db.Column(db.Integer, primary_key=True)
    # ...
    album_id = db.Column(db.Integer, db.ForeignKey('Album.id'))
    photographe_id = db.Column(db.Integer, db.ForeignKey('User.id'))
class Album(db.Model): # class C
    __tablename__ = 'Album'
    id = db.Column(db.Integer, primary_key=True)
    # ...
    pictures = db.relationship('Picture', backref='album')
    auteur_id = db.Column(db.Integer, db.ForeignKey('User.id'))

为了不那么抽象,我想直接从s 实例访问(所有)photographes在 an 中表示的人。因为我可以访问和。albumalbumauteurpictures

PS:我应该使用多态性来处理问题(用户的子类:Lambda;Photographe;作者)吗?

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


如果您想要反向访问(从相册到作者的所有图像):

album = Album.query.filter_by(id=111).first()

然后:

images = album.auteur.images

推荐阅读