ORM запрос много ко многим к одному, колба sql-алхимия

#sql #flask #sqlalchemy #flask-sqlalchemy

Вопрос:

У меня есть три модели колбы-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),
                                )
 

Проблема: я пытаюсь перейти book_name от Book модели через Company Bookscomp .
Таким образом, у компании много книг, и в каждой книге есть ссылка на общую информацию о книге.
Пробовал вот так:

 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
 

Почему я не могу напрямую попасть book_name в приведенный выше фрагмент кода? И как было бы лучше всего этого достичь?

Ответ №1:

Вы не определили отношения между Book и Bookcomp , поэтому, когда вы просите 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')