django - 优化的 Django 查询集

标签 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 序列化。

我愿意接受所有优化此查询集的建议(如果有)。

谢谢!

最佳答案

在尝试每一种可能的优化之前,您应该先了解 ORM 生成的 SQL 查询(您可以 print it to stdout 或使用类似 django debug toolbar 的查询),看看它的速度慢在哪里。之后我建议您使用 EXPLAIN ANALYZE 运行该查询并找出该查询速度慢的原因。如果由于必须传输大量数据而导致查询速度较慢,那么使用 onlydefer 就很有意义。仅当您需要检索大量数据时,使用 onlydefer(或 values)才能提供更好的性能,但它不会使您的数据库性能下降工作变得更加容易(当然,除非您真的必须读取大量数据)。

由于您使用的是 Django 和 Postgresql,因此您可以使用 manage.py dbshel​​l 获取 psql session ,并使用 \timing 获取查询计时

关于django - 优化的 Django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497353/

相关文章:

Python 3 Django Rest Framework - 如何向这个 M-1-M 模型结构添加自定义管理器?

python - 无法从 CreateView 重定向

python - Django模型层中GET和FILTER的区别

python - Django Unique Together(带外键)

django - Django 的自定义模型字段方法 to_python 何时获取除实例以外的任何内容?

python - Django - 类内属性的上下文字典

django - 使 Django forms.DateField 显示使用本地日期格式

python - Django 查询顶级模型

python - 模型实例上的 Django 引用管理器和相关管理器

sql - Django 。数据库查询: distinct for one field