Есть ли способ узнать, были ли предварительно сброшены связанные объекты?
Есть ли способ узнать, были ли связанные объекты предварительно извлечены из экземпляра модели?
Предположим, что у человека есть
class Order( models.Model):
...
def is_all_in_stock( self):
# how to do this?
class LineItem( models.Order):
order = models.ForeignKey( Order, ..., related_name='line_items')
stock = models.ForeignKey( Stock, ...)
...
И человек хочет создать некоторый отчет обо всех заказах, которые задерживаются по разным причинам
for order in orders: # orders is a queryset
...
out_of_stock = any([ line.stock.status != IN_STOCK
for line in order.line_items.all() ])
Это эффективно, если выполняется итерация по набору запросов, который сделал .prefetch_related( "line_items", "line_items__stock). Это вообще не бьет по БД. Он бьет по БД, если не бьет.
С другой стороны, использование кверисета типа
out_of_stock = order.line_items.exclude( stock__status = IN_STOCK ).exists()
посещает БД только один раз для каждого заказа, классическая проблема N+1,
Можно ли написать метод order.is_all_in_stock(self), чтобы он использовал преимущества того, что было префетчено, если оно было префетчено, и возвращался к выполнению запроса при каждом вызове, если нет?