Оптимизация запроса 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')
Этого запроса должно быть достаточно