django在filter()中使用时是否缓存相关表

时间:2018-04-05 20:41:07

标签: python django django-models

例如:

e = Entries.objects.filter(blog__name='Something')

这是否也会缓存blog,或者我是否应该向此添加select_related('blog')

2 个答案:

答案 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