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.shelvesshelf.books。但是,要阅读书籍,我必须遍历书架并调用.books

有没有办法在这里呼叫store.books

最佳答案

一种选择是将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定义关系的方式非常接近。

关于python - Flask通过模型关联有很多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54937219/

10-12 19:38