嘿,伙计们,我是django的新手,对大量使用这些表达式有疑问。blog.user.username
或blog.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
,user
和profile
。
你可以使用.select_related(…)
来提高效率[Django-doc]。实际上,如果我们使用:
get_object_or_404(
Blog.objects.select_related('user', 'user__profile'),
pk=id
)
它将在相同的查询中加载相关的user
和profile
,因此这将只需要一个查询,.user
和.user.profile
数据将通过该数据库查询加载。