Django queryset и генератор

просто ни с того ни с сего мне интересно, если следующий способ итерации через результирующий набор с помощью генератора вызовет какое-либо положительное или отрицательное влияние на нормальную итерацию?

например.

def all_items_generator():
  for item in Item.objects.all():
    yield item

for item in all_items_generator():
  do_stuff_with_item(item)

против:

for item in Item.objects.all():
  do_stuff_with_item(item)

2 ответов


первый будет медленнее, так как он создаст список, содержащий все модели, а затем даст их по одному, в то время как последний будет просто использовать список напрямую. Если вы хотите генератор, то вы должны использовать QuerySet.iterator().


нет. Кроме того, что это более многословно, избыточно и не особенно полезно (в контексте генератора, который вы предоставили).

когда вы Item.objects.all() на for, они повторяются с помощью итератор кэширование запросов (источник). Если вы не хотите кэшировать результаты, используйте iterator() как Игнасио рекомендует.