例如:
e = Entries.objects.filter(blog__name='Something')
这是否也会缓存blog
,或者我是否应该向此添加select_related('blog')
。
答案 0 :(得分:0)
keystr keynum value
1 abc 5 J
2 def 2 L
3 def 7 P
4 abc 3 I
表示Django在获取查询集时会进行连接。但是,如果您想访问相关博客,则仍需使用filter(blog__name='Something')
。
您可能会发现django-debug-toolbar非常有用,因此您可以自己检查查询。
答案 1 :(得分:0)
你会看到所有博客的属性以及更远的东西。 Django自动完成所有这些工作。但它会根据需要在内部执行其他查询以获取博客(超出 blog_id )和其他任何内容。使用 select_related 获取您将使用的任何内容。如果 select_related 不起作用,则大多数情况下 prefetch_related 将起作用。区别在于 prefetch_related 为每个表执行额外查询。如果查询包含主表的多个记录 - 即1 + 1而不是1 + n。这仍然比让Django自动完成所有操作更好。
我怀疑部分混乱是关于 filter()。 过滤和排除以及获取所有()之外的其他方式的其他方式将引用 WHERE 中的其他表格查询的一部分,但Django不会从这些表中检索字段,除非您访问它们,除非您使用 select_related 或 prefetch_related 。