Колба имеет много через модельные ассоциации - PullRequest
0 голосов
/ 01 марта 2019

У Ruby on Rails есть связь «есть много через».Например,

store has_many :shelves
shelf has many :books
store has_many :books, through: :shelves

Это позволит нам позвонить store.books и получить все книги в магазине.Я пытаюсь воспроизвести эту функцию во Flask, но не могу найти информацию.

Например, вот отношения один ко многим, написанные на Python.В магазине много полок, на полках много книг.

class Store(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    shelves = db.relationship('Shelf', backref='store')

class Shelf(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    location = db.Column(db.String(120), nullable=False)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'), nullable=False)
    books = db.relationship('Book', backref='shelf')

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    shelf_id = db.Column(db.Integer, db.ForeignKey('shelf.id'), nullable=False)    

С кодом, который написан в данный момент, я могу позвонить store.shelves и shelf.books.Однако, чтобы добраться до книг, мне пришлось бы пройтись по полкам и позвонить .books.

Есть ли способ позвонить сюда store.books?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Одним из вариантов является использование Shelf в качестве «вторичной» таблицы и создание одностороннего отношения «многие ко многим», хотя на самом деле отношение «один ко многим» с таблицей между ними:

class Store(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    shelves = db.relationship('Shelf', backref='store')
    books = db.relationship('Book', secondary='shelf', viewonly=True)

Лучше относиться к отношениям только как к представлению, поскольку нет способа решить, к какой полке должна идти книга, если она добавлена ​​в список Store.books.Это довольно близко к тому, как Rails обрабатывает определение отношений.

0 голосов
/ 01 марта 2019

Зацикливание на полках было бы очень неэффективно.Оставьте это вашей базе данных двигателя.

Вам нужно создать собственный запрос для достижения этой цели.Если вы хотите вызвать его с помощью store.books, вы можете создать свойство в Store классе:

class Store(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    shelves = db.relationship('Shelf', backref='store')

    @property
    def books(self):
        query = Book.query.join(Shelf).join(Store).filter(Store.id == self.id)
        return query.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...