Django. Фильтрация как связанной, так и относящейся модели на основе поля в относящейся модели

У меня есть две модели:

class Genre(models.Model):
   name=models.CharField()

class Book(models.Model):
   name=models.CharField()
   genre=models.ForeignKey(Genre, related_name='book', on_delete=models.CASCADE)
   published=models.BooleanField()

У меня также есть базовые сериализаторы для них:

class BookSerializer(serializers.ModelSerializer):
   class Meta:
      model=Book
      fields='__all__'

class GenreSerializer(serializers.ModelSerializer):
   books = BookSerializer(source='book', many=True)
   class Meta:
      model=Genre
      fields='__all__'

Мне нужно запросить и сериализовать модели жанров и связанные с ними модели книг исключая книги, которые не опубликованы. Мне также не нужно запрашивать жанры, в которых нет опубликованных книг.

Пример:

g1=Genre(name='g1') #Serialize
b1=Book(genre=g1, name='b1', published=False) #Don't serialize
b2=Book(genre=g1, name='b2', published=True) #Don't serialize

g2=Genre(name='g2') #Don't serialize, because there's no published books for this genre
b3=Book(genre=g2, name='b3', published=False) #Don't serialize

Желаемый результат:

[
  {
    'id': 1,
    'name': 'g1',
    'books': [
       {
         'id': 2,
         'name': 'b2',
         'published': true
       }
    ]
  }
]

Ни один из способов фильтрации и исключения, которые я пробовал, не сработал. Все они, похоже, влияют только на внешнюю модель (жанр в данном случае), и я не могу понять, как сначала отфильтровать лежащие в основе книги, а затем отфильтровать жанры на основе результата фильтрации книг.

Я нашел обходной путь, но он включает в себя несколько запросов, создание нового временного жанра и его последующее удаление, так что этот подход не совсем подходит.

Вернуться на верх