Django在所有上使用过滤器时的查询性能

时间:2015-04-24 00:23:18

标签: django django-queryset

以下两个获取数据的选项之间的性能影响是什么:

def get_something(self):
    something = [s for s in self.something.all() if s.type in(
        TYPE2, TYPE1)]
    return sorted(something, key=lambda e: e.get_timestamp())

vs

def get_something(self):
    something = self.something.all().filter(
    type__in=[TYPE1, TYPE2])
    return sorted(something, key=lambda e: e.get_timestamp())

似乎第二个需要更少的内存,但我被告知第二个将导致两个查询而不是1.这是否是这种情况和什么被认为是更好的风格

1 个答案:

答案 0 :(得分:3)

两个片段都会导致单个数据库命中。在简单的情况下,第二个片段会更快。

但关键问题是:你如何得到self

如果它是一个用get()方法加载的单个对象,那么第二个选项就是可行的方法。

obj = MyModel.objects.get(pk=123) # or MyModel.objects.filter(...).first()
print obj.get_something()

但是,如果使用prefetch_related()加载多个对象,则第一个选项可能更有效:

for obj in MyModel.objects.prefetch_related('something').filter(...):
    print obj.get_something()