优化的Django Queryset

时间:2015-12-28 16:45:41

标签: django django-models django-queryset

我有以下功能来确定谁下载了某本书:

@cached_property
def get_downloader_info(self):
    return self.downloaders.select_related('user').values(
        'user__username', 'user__full_name')

由于我只使用了两个字段,在其余字段上使用.defer()是否有意义?

我尝试使用.only(),但是我收到一个错误,即某些字段不是JSON可序列化的。

我打开所有建议(如果有的话),以优化此查询集。

谢谢!

1 个答案:

答案 0 :(得分:2)

在尝试所有可能的优化之前,您应该开始使用ORM生成的SQL查询(您可以print it to stdout或使用django debug toolbar之类的内容),看看它的速度有多慢。之后,我建议您使用EXPLAIN ANALYZE运行该查询,并找出该查询的速度有多慢。如果查询速度很慢,因为必须传输大量数据,而使用onlydefer很有意义。使用onlydefer(或values)只有在需要检索大量数据时才能提供更好的性能,但它不会使您的数据库工作变得更加容易(除非您真的需要当然读了很多数据。)

由于您使用的是Django和Postgresql,因此可以使用manage.py dbshell获取psql会话,并使用\timing获取查询时间