使用 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_related
或 prefetch_related
来提高性能。
我一直在研究二级反向外键,二级外键继承了子类。我正在使用 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_related
或 prefetch_related
来提高性能。