Django запрос с отфильтрованными аннотациями из связанной таблицы
Возьмем модели книг и авторов, например, книги с одним или несколькими авторами. Книги, имеющие тип_обложки, и авторы, имеющие страну происхождения.
Как я могу перечислить все книги с твердой обложкой, и авторов только если они из Франции?
Books.objects.filter(cover_type='hard', authors__origin='france')
Этот запрос не извлекает книги с твердой обложкой, но без французского автора.
Мне нужны все книги с твердой обложкой, это предикат №1. И если их авторы из Франции, я хочу, чтобы они были аннотированы, иначе поле authors может быть пустым или 'None'.
Пробовал много вариантов, аннотацию, Q, значение, подзапрос, when, case, exists, но не смог найти решение.
Вы должны использовать идентификатор книги в таблице Auther.Тогда ваш запрос будет выглядеть следующим образом: Author.objects.filter(origin="france",book__cover_type="hard")
Мне кажется, я решил эту проблему с помощью подзапроса, outerref, exists, case, when, charfield... слишком много импорта для простого sql. `
author = Authors.objects.filter(bookref=OuterRef('id'), origin='France').values('origin')
books = Books.objects.filter(cover_type='hard').annotate(author=Case(When(Exists(author), then=Subquery(author)), default='none', output_field=CharField())).distinct().values('name','cover_type','author')
`