ORM查询多对多一,Flask sql-alchemy

Posted

技术标签:

【中文标题】ORM查询多对多一,Flask sql-alchemy【英文标题】:ORM query many to many to one, Flask sql-alchemy 【发布时间】:2021-04-14 10:13:23 【问题描述】:

我有三个烧瓶 sqlalchemy 模型。 Books - 管理员的唯一条目:

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    book_name = db.Column(db.String(20), unique=True, nullable=False)
    def __repr__(self):
        return self.book_name

Bookscomp - 用户条目,与上述相关:

class Bookscomp(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    book = db.Column(db.Integer, db.ForeignKey('book.id'))

Company - 用户,与上述相关:

class Company(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100), nullable=False)
    books = db.relationship('Bookscomp', secondary=companybook, lazy='dynamic',
        backref=db.backref('company'))

companybook = db.Table('companybook',
    db.Column('companyid', db.Integer, db.ForeignKey('company.id'), primary_key=True),
    db.Column('bookid', db.Integer, db.ForeignKey('bookscomp.id'), primary_key=True),
                                )

问题:我正在尝试通过Company + BookscompBook 模型中获取book_name。 所以一家公司有很多书,每本书都有参考一般书籍信息。 试过这样:

company = OrganizatCompanyion.query.filter_by(id=comp.id).first()
    books = company.books.all()
for item in books:
        print(item.book.book_name)
        #AttributeError: 'int' object has no attribute 
        print(item.book)
        #Gives book id from book model, but I need name

为什么我不能直接在上面的代码sn-p中得到book_name?以及如何最好地实现这一目标?

【问题讨论】:

【参考方案1】:

您尚未定义 BookBookcomp 之间的关系,因此当您请求 item.book 时,它会获得 book = db.Column(db.Integer... 值。也许将您的 Bookscomp 模型调整为:

class Bookscomp(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
    book = db.relationship('Book')

【讨论】:

以上是关于ORM查询多对多一,Flask sql-alchemy的主要内容,如果未能解决你的问题,请参考以下文章

python flask(多对多表查询)

Python学习第135天(Django的ORM多对多查询)

Django ORM - 通过模型查询多对多?

beego orm 多对多插入和查询操作

Kohana 3 ORM:如何使用 2 个多对多关系执行查询

Django 补充ORM多对多正向查询