Django:像blog.user.username这样的表达式在Django中执行额外的数据库操作吗?



嘿,伙计们,我是django的新手,对大量使用这些表达式有疑问。blog.user.usernameblog.user.email,等等。这是否执行像我们调用User.objects.get(username=blog.user.username)这样的数据库操作来获取该信息?或者当我们加载blog实例对象时它是预加载的,我的意思是与这个get_object_or_404(Blog, id=id)一起?

Django惰性加载关系:这意味着如果你加载一个blog对象,它不会立即加载user,因此只有当你稍后访问.user时,它才会在内存中加载用户。例如,如果您使用blog.user.profile,那么它将查询blog,userprofile

你可以使用.select_related(…)来提高效率[Django-doc]。实际上,如果我们使用:

get_object_or_404(
Blog.objects.select_related('user', 'user__profile'),
pk=id
)

它将在相同的查询中加载相关的userprofile,因此这将只需要一个查询,.user.user.profile数据将通过该数据库查询加载。

最新更新