Как создать отношения один-ко-многим на основе одного к одному (три таблицы)? - PullRequest
0 голосов
/ 20 апреля 2019

Я изучаю бэкэнд-разработку на python, используя флак и SQLachemy.Я понял, как делать отношения один-к-одному, один-ко-многим и многие-ко-многим.И теперь я пытаюсь сделать более сложные отношения.

Есть 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 экземпляров.Как я могу получить доступ к auteur и pictures.

PS: Должен ли я использовать полиморфизм для решения проблемы (подклассы пользователя: лямбда; фотограф; автор)?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

На самом деле самый удобный ответ - использовать свойство внутри класса Альбома.

class Album(db.Model):
    # ...
    @property
    def photographes(self):
        photographes = set()
        for img in self.pictures:
            if img.photographe not in photographes:
                photographes.add(img.photographe)
        return photographes

Я поделился всем своим бэкэндом на git , это может быть полезно!

0 голосов
/ 20 апреля 2019

Если вы хотите обратный доступ (из альбомов ко всем изображениям автора):

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

тогда:

images = album.auteur.images
...