我有以下函数来确定谁下载了某本书:
@cached_property
def get_downloader_info(self):
return self.downloaders.select_related('user').values(
'user__username', 'user__full_name')
由于我只使用两个字段,因此对其余字段使用 .defer()
有意义吗?
我尝试使用 .only()
,但收到错误消息,指出某些字段不可 JSON 序列化。
我愿意接受所有优化此查询集的建议(如果有)。
谢谢!
最佳答案
在尝试每一种可能的优化之前,您应该先了解 ORM 生成的 SQL 查询(您可以 print it to stdout 或使用类似 django debug toolbar 的查询),看看它的速度慢在哪里。之后我建议您使用 EXPLAIN ANALYZE 运行该查询并找出该查询速度慢的原因。如果由于必须传输大量数据而导致查询速度较慢,那么使用 only
或 defer
就很有意义。仅当您需要检索大量数据时,使用 only
和 defer
(或 values
)才能提供更好的性能,但它不会使您的数据库性能下降工作变得更加容易(当然,除非您真的必须读取大量数据)。
由于您使用的是 Django 和 Postgresql,因此您可以使用 manage.py dbshell
获取 psql session ,并使用 \timing
获取查询计时
关于django - 优化的 Django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497353/