python - Django select_related 不执行任何操作

标签 python django

我在 django 中有一个评论模型,其中包含对用户模型的外键引用,我正在尝试查找(某个帖子 ID 的)评论,然后加入/获取评论作者的用户数据。这就是我正在做的事情

    result = Comment.objects.filter(post=post).select_related('user').order_by('-created_at')

当我返回结果时,我得到的对象与添加 select_lated() 函数之前得到的对象完全相同。我在这里遗漏了什么吗?

最佳答案

.select_related(…) [Django-doc]函数在查询中进行 JOIN,因此将使用查询加载相关 .user 对象的数据。如果您使用.select_lated(…),那么访问Comment.user将导致额外的查询。因此,如果您需要加载 NComment 的所有用户,那么将需要 N+1 个查询(这就是著名的 < em>N+1 问题)。

.select_lated(…) 因此功能上不会(太多)改变,但是如果您计划访问所有,它会导致(显着)性能提升>.评论的用户

因此,您可以使用以下命令打印 Comment 对象中 .user.username:

for comment in Comment.objects.select_related('user'):
    print(comment.user.username)

如果执行此操作时没有.select_lated(…)子句,则会导致大量查询。

关于python - Django select_related 不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58841019/

相关文章:

python - 如何在 Python 中将 UTF8 字符串从应用程序保存到网络服务器

python - 如何更改 python 中的错误消息?

php - 什么时候 Web 框架不方便使用?

python - Graphite 烯/Django (GraphQL) : How to use a query argument in order to exclude nodes matching a specific filter?

django - Django SelectMultiple 小部件的动态选择

django.db.models get_models 在 django1.4 中返回空列表

python - 如何在基于 Django 类的 View 中使用 csrf_exempt 分派(dispatch)特定方法

Python 请求模块不适用于带路径的 url

python - 为什么在 SqlAlchemy 中使用 "db.*"?

python - django 的登录 session