Есть ли способ узнать, были ли предварительно сброшены связанные объекты?

Есть ли способ узнать, были ли связанные объекты предварительно извлечены из экземпляра модели?

Предположим, что у человека есть

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), чтобы он использовал преимущества того, что было префетчено, если оно было префетчено, и возвращался к выполнению запроса при каждом вызове, если нет?

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