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
}
]
}
]
Ни один из способов фильтрации и исключения, которые я пробовал, не сработал. Все они, похоже, влияют только на внешнюю модель (жанр в данном случае), и я не могу понять, как сначала отфильтровать лежащие в основе книги, а затем отфильтровать жанры на основе результата фильтрации книг.
Я нашел обходной путь, но он включает в себя несколько запросов, создание нового временного жанра и его последующее удаление, так что этот подход не совсем подходит.