Запрос (объект, который я ищу), который состоит из пользователя, которому назначается роль, представленного указанным запросом. См. ниже:
class Request(db.Model):
__tablename__ = 'requests'
id = Column(Integer, primary_key=True)
user = Column(Integer, ForeignKey("users.id"), nullable=False)
role = Column(Integer, ForeignKey("roles.id"), nullable=False)
...
И наши отношения:
# Define relationship between a User and their Requests
requests = relationship('Request', backref='requested_by', lazy='dynamic')
# Define relationship between a Role and Requests for this Role
requests = relationship('Request', backref='requested_role', lazy='dynamic')
И, наконец, цель:
# Return any requests made by a user or a role matching the search query
data = Request.query.filter(or_(Request.requested_by.name.contains(search_query),
Request.requested_by.username.contains(search_query),
Request.requested_role.name.contains(search_query))).all()
Выполнение приведенного выше кода приводит к следующему:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Request.requested_by has an attribute 'name'
Идея здесь в том, чтобы иметь возможность искать объекты запроса по релевантным деталям пользователя или связанной с ними роли. Это возможно?
1 ответ
Да. Вам нужно выполнить соединение:
Request.query.join(Request.requested_by) \
.join(Request.requested_role) \
.filter(or_(User.name.contains(search_query),
User.username.contains(search_query),
Role.name.contains(search_query)))
Обратите внимание, что это создает запросы LIKE '%whatever%'
, которые невероятно неэффективны, если у вас большая таблица.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
pg_trgm
. Полнотекстовый поиск - это еще один подход, но он может не работать. для имен пользователей.