Оптимизация запроса Django ORM для получения объекта, если определенный связанный объект не существует

У меня есть следующие структуры таблиц:

class Library:
    id = models.CharField(...)
    bookcase = models.ForeignKey(
        Bookcase,
        related_name="libraries"
    )
    location = models.ChoiceField(...)
    # Other attributes...

class Bookcase:
    # some attributes
    type = models.ChoiceField(..)

class Book:
    bookcase = models.ForeignKey(
        Bookcase,
        related_name="books"
    )
    title=models.CharField(...)
    status=models.ChoiceField(...) # borrowed | missing | available
       

Скажем, если я хочу получить все объекты библиотеки, в которых нет книги с названием "Foo", которая НЕ отсутствует, как я могу оптимизировать этот запрос? У меня есть следующее:

libraries = Library.objects.select_related('bookcase').filter(location='NY', bookcase__type='wooden')

libraries_without_book = []
for library in libraries:
    has_non_missing_book = Book.objects.filter(
        bookcase=library.bookcase,
        title="Foo",
    ).exclude(status='missing').exists()
    
    if not has_non_missing_book:
        libraries_without_book.append(library.id)

К сожалению, при этом выполняется дополнительный запрос для каждого объекта библиотеки, который соответствует начальному условию фильтрации. Есть ли более оптимизированный метод, который я могу использовать здесь, который каким-то образом использует prefetch_related?

Book.objects.filter(~Q(status='missing'),bookcase=library.bookcase,title='Foo')

Этого запроса должно быть достаточно

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