首页 > 解决方案 > Django select_related 什么都不做

问题描述

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

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

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

标签: pythondjango

解决方案


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

.select_related(..)因此在功能上不会改变(很多),但是如果您计划访问.users 的所有 s ,它会导致(显着)性能提升Comment

因此,您可以例如打印对象.username中的.users Comment

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

如果在没有子句的情况下执行此操作.select_related(..),则会导致大量查询。


推荐阅读