python - Django select_related 什么都不做
问题描述
我在 django 中有一个评论模型,其中包含对用户模型的外键引用,我正在尝试查找评论(某个帖子 ID),然后加入/获取评论作者的用户数据。这就是我正在做的
result = Comment.objects.filter(post=post).select_related('user').order_by('-created_at')
当我返回结果时,我得到了与添加select_related()
函数之前完全相同的对象。我在这里错过了什么吗?
解决方案
[ .select_related(..)
Django-doc]函数在查询中进行 JOIN,因此将使用查询来加载相关.user
对象的数据。如果您不使用.select_related(..)
,则访问.user
aComment
将导致额外的查询。如果您因此需要加载N Comment
s 的所有用户,那么这将需要N+1 个查询(这就是著名的N+1问题)。
.select_related(..)
因此在功能上不会改变(很多),但是如果您计划访问.user
s 的所有 s ,它会导致(显着)性能提升Comment
。
因此,您可以例如打印对象.username
中的.user
s Comment
:
for comment in Comment.objects.select_related('user'):
print(comment.user.username)
如果在没有子句的情况下执行此操作.select_related(..)
,则会导致大量查询。