Django查询集和生成器

Jam*_*Lin 9 python iteration django generator

突然之间,我想知道使用生成器迭代结果集的以下方式是否会对正常迭代产生任何正面或负面影响?

例如.

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

for item in all_items_generator():
  do_stuff_with_item(item)
Run Code Online (Sandbox Code Playgroud)

反对:

for item in Item.objects.all():
  do_stuff_with_item(item)
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 17

前者会比较慢,因为它会创建一个包含所有模型的列表,然后一次生成一个,而后者只是直接使用列表.如果你想要一台发电机,那么你应该使用它QuerySet.iterator().


Jef*_*eff 5

不。除了它更冗长、多余且不是特别有用的事实(在您提供的生成器的上下文中)。

当您Item.objects.all()在 a 中执行时for,它们将使用带有查询缓存(source)的迭代器进行迭代。如果您不希望缓存结果,请像 Ignacio 建议的那样使用。iterator()