我有以下功能来确定谁下载了某本书:
@cached_property
def get_downloader_info(self):
return self.downloaders.select_related('user').values(
'user__username', 'user__full_name')
由于我只使用了两个字段,在其余字段上使用.defer()
是否有意义?
我尝试使用.only()
,但是我收到一个错误,即某些字段不是JSON可序列化的。
我打开所有建议(如果有的话),以优化此查询集。
谢谢!
答案 0 :(得分:2)
在尝试所有可能的优化之前,您应该开始使用ORM生成的SQL查询(您可以print it to stdout或使用django debug toolbar之类的内容),看看它的速度有多慢。之后,我建议您使用EXPLAIN ANALYZE运行该查询,并找出该查询的速度有多慢。如果查询速度很慢,因为必须传输大量数据,而使用only
或defer
很有意义。使用only
和defer
(或values
)只有在需要检索大量数据时才能提供更好的性能,但它不会使您的数据库工作变得更加容易(除非您真的需要当然读了很多数据。)
由于您使用的是Django和Postgresql,因此可以使用manage.py dbshell
获取psql会话,并使用\timing
获取查询时间