Мне нужна помощь в выполнении одного запроса, объединяющего несколько таблиц (многие-ко-многим), однако я хочу включить Peewee PostgreSQL, эквивалентный Python операторам any () и all ().
Схема
- Почта: id, имя_почты
- Метка: id, tag_name
- Автор: id, имя_пользователя
- Post_Tags: post_id, tag_id
- Post_Authors: post_id, author_id
Запрос
С учетом списка из нескольких имен тегов и список нескольких имен авторов, я хочу, чтобы все сообщения, которые имеют ЛЮБОЙ тег, который соответствует И имеют ВСЕХ авторов, которые соответствуют:
Пример
tag_list = [“Politics”, “Economy”]
author_list = [“Sarah”, “Alex”]
Запрос вернет все сообщения, которые имеют хотя бы один тег «Политика» или «Экономика» И имеют в качестве авторов «Сара» и / или «Алекс». Однако, если авторами сообщения являются "Сара" и "Кристина", это сообщение НЕ должно отображаться.
Это мой текущий запрос, но он не удовлетворяет всем моим условиям:
query = Post
.select()
.join(PostTags)
.join(Tag)
.switch(Post)
.join(PostAuthors)
.join(Authors)
.where((Tag.name << tag_list) & (Author.name << author_list))
Однако мне все еще нужно перебрать свой запрос для выполнения sh того, что мне нужно:
filtered_posts = []
for post in query:
if all(author.name in author_list for author in post.authors):
filtered_posts.append(post)
Какие-нибудь советы по оптимизации моего запроса в Peewee? Заранее спасибо!