如何基于一对一(三个表)创建一对多关系?

时间:2019-04-19 22:35:29

标签: python sqlalchemy flask-sqlalchemy

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

有3个模型类,它们具有以下关系:

  • A类和B类具有一对一的关系
  • B类和C类具有许多(B)到一个(C)的关系
  • A类和C类具有许多(C)到一个(A)的关系

现在我想在C和A之间建立一个通过B关系的关系(抽象问题提法,继续阅读具体提法)

文档中提到了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'))

为了不那么抽象,我想直接从photographes的实例访问album中表示的所有album人。因为我可以访问auteurpictures

PS:我应该使用多态性来解决此问题(用户的子类:Lambda;照片;作者)吗?

2 个答案:

答案 0 :(得分:0)

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

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

然后:

images = album.auteur.images

答案 1 :(得分:0)

实际上,最方便的答案是使用Album类中的属性。

if(message.content.indexOf("longtail") >= 0){
      message.react(message.guild.emojis.get('549871163468152832'))
  }

我在git上分享了我的整个后端,这可能很有用!