python - 如何基于一对一(三个表)创建一对多关系?
问题描述
我正在学习使用flask和SQLachemy在python上进行后端开发。我已经理解了建立一对一、一对多和多对多关系的方式。而现在我正在尝试建立一种更棘手的关系。
有 3 个模型类,具有这些关系:
- A类和B类是一对一的关系
- B类和C类具有多(B)对一(C)的关系
- A类和C类具有多(C)对一(A)的关系
现在我想通过 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 中表示的人。因为我可以访问和。album
album
auteur
pictures
PS:我应该使用多态性来处理问题(用户的子类:Lambda;Photographe;作者)吗?
解决方案
如果您想要反向访问(从相册到作者的所有图像):
album = Album.query.filter_by(id=111).first()
然后:
images = album.auteur.images
推荐阅读
- python - 在栏中显示价值
- javascript - reactjs中通过数组映射的问题
- c - 如何知道从任务 B 发送到任务 A 的数据类型?
- javascript - 如何修复在模态中单击关闭时抽屉不打开的问题
- ecore - 我可以从 Sirius 调用 Ecore 操作吗
- python - 为什么 python-dotenv 在 Django 项目中无法正常工作
- python - 使用 xlsxwriter,无法打开 Excel 文件。文件扩展名无效
- python - 如何在没有循环的情况下更新字典列表?
- java - 将 AWS Lambda 函数放入 VPC,然后“IOException: Connection reset by peer”开始发生,但只是偶尔发生
- python - 使用 Python 格式化日期(例如 2020 年 1 月 2 日)