Flask / SQLAlchemy - запрашивает таблицы с отношениями «многие ко многим» - PullRequest
2 голосов
/ 18 марта 2019

Я использовал Flask и SQLAlchemy для создания приложения на основе базы данных.Вот классы, которые я определил:

models.py

 class HasTag(db.Model):
    tagged_document_id = db.Column(db.Integer, db.ForeignKey('Document.id'), primary_key=True)
    document_tag_id = db.Column(db.Integer, db.ForeignKey('Tag.id'), primary_key=True)

class Document(db.Model):
    id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True)
    title = db.Column(db.Text)
    tag = db.relationship("Tag",
                    secondary=HasTag,
                    back_populates="tagged_document",
                    lazy="dynamic")

class Tag(db.Model):
    id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True)
    label = db.Column(db.String, nullable=False)
    tagged_document = db.relationship("Document",
                    secondary=HasTag,
                    back_populates="tag",
                    lazy="dynamic")

В приложении у меня есть форма расширенного поиска, где можно сделатьПолнотекстовый поиск по различным полям таблицы документа.

rout.py

@app.route("/search")
def search():
    keyword = request.args.get("keyword", None)   
    query = Document.query

    if keyword:
        query = Document.query.filter(or_(
            Document.title.like("%{}%".format(keyword)),
            ...
        ))

Дело в том, что я хотел бы иметь возможность искатьключевое слово, данное пользователем также в метке тега.Я пытался что-то вроде:

    if keyword:
        query = Document.query.join(Tag).filter(or_(
            Document.title.like("%{}%".format(keyword)),
            ...,
            Tag.label.like("%{}%".format(keyword))
        ))

Но я получаю эту ошибку: AttributeError: 'HasTag' object has no attribute 'foreign_keys'

Можете ли вы помочь мне?Спасибо!

1 Ответ

1 голос
/ 18 марта 2019

У меня похожая структура в одном из моих проектов, и вот как я определяю relatioship:

leagues = db.relationship("League", 
                          secondary=LeagueTeamAssociation.__tablename__,
                          back_populates="teams")

Итак, вам нужно указать имя таблицы для параметра secondary, используя либо вышесинтаксис (вам нужно добавить __tablename__ к вашему классу HasTag) или использовать строку "has_tag" (при условии, что это имя таблицы в базе данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...