以下两个获取数据的选项之间的性能影响是什么:
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.这是否是这种情况和什么被认为是更好的风格
答案 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()