我在 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
将导致额外的查询。因此,如果您需要加载 N 个 Comment
的所有用户,那么将需要 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/