2015-09-04 58 views
0

我一直在研究具有继承子类的第二级别的2级反向外键。我正在使用django-model-utils进行继承。我一直没有使用调整的预取命令,直到我找到了答案遍历查询集在这个岗位 Prefetch object with multiple levels of reverse lookups使用select_subclasses对反向外键进行2级预取

我的问题是,
1)我没有看到与反向外键的表内加入时,我打印查询。那是因为prefetch将它们拉入单独的查询中吗?

print product_types.query 

2)遍历中的.all()命中数据库?或者django从单个预取中提取数据?

pt.bevtank_set.all() 

3)一般来说,有关如何找出我真正查询的内容的任何提示?我不想做符合我需求的事情,但是做一些符合我需求的正确方法。

非常感谢您的时间!

回答

0

是的,prefetch_related在单独的查询中获取相关表,因此您看不到内部联接。

如果您预取了bevtank_set,则pt.bevtank_set.all()不会导致任何其他查询。但pt.bevtank_set.filter()将导致其他查询。您可以使用Django 1.7+中的Prefetch对象预取过滤器预取的查询集。

关于一般提示,Django Debug Toolbar可用于查看SQL查询。如果存在重复的查询,则通常表明您可以添加select_relatedprefetch_related以提高性能。

+0

感谢您的工具栏提示!我有一个后续问题。 因此,我实际上预取了Prefetch类,因为我不得不在第二级调用select_subclasses()。将这些数据交给模板进行显示的首选方式是什么?通常,我使用values()来提取必需的字段,并将这些数据交给模板进行渲染。在这种情况下,我无法调用values(),因为没有内部连接。我是否需要通过遍历生成单独的字典,然后将其传递给模板? – coolarm

+0

我不确定我是否理解您的数据模型,因此我不知道将其传递给模板的最佳方式。如果在视图中创建单独的字典适合你,那听起来不错。 – Alasdair