使用 select_subclasses 反向外键的 2 级预取

2-level prefetch on reverse foreign key with select_subclasses

我一直在研究二级反向外键,二级外键继承了子类。我正在使用 django-model-utils 进行继承。我一直在不使用地调整预取命令,直到我在这个 post 中找到遍历查询集的答案

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

print product_types.query  

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

pt.bevtank_set.all()

3) 总的来说,关于如何弄清楚我真正查询的内容有什么提示吗?我不想做满足我需求的事情,而是做能够满足我需求的正确方式。

非常感谢您的宝贵时间!

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

如果您预取了 bevtank_set,那么 pt.bevtank_set.all() 将不会引起任何额外的查询。但是 pt.bevtank_set.filter() 会导致额外的查询。您可以使用 Django 1.7+ 中的 Prefetch 对象来预取预取查询集的过滤器。

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