如果我们有2个具有多对多关系的模型A,B。
我想获得一个类似于此的sql查询:
SELECT *
FROM a LEFT JOIN ab_relation
ON ab_relation.a_id = a.id
JOIN b ON ab_relation.b_id = b.id;
Run Code Online (Sandbox Code Playgroud)
所以在Django,当我尝试:
A.objects.prefetch_related('bees')
Run Code Online (Sandbox Code Playgroud)
我收到2个类似的查询:
SELECT * FROM a;
SELECT ab_relation.a_id AS prefetch_related_val_a_id, b.*
FROM b JOIN ab_relation ON b.id = ab_relation.b_id
WHERE ab_relation.a_id IN (123, 456... list of all a.id);
Run Code Online (Sandbox Code Playgroud)
鉴于A和B的表比较大,我发现django的方式满足我的需求太慢了。
问题是:是否可以通过ORM获得左联接手动编写的查询?
编辑以回答一些澄清:
是的LEFT OUTER JOIN,最好是将a放在查询集中,而不仅仅是与B有关系的SQL(更新的sql)。
中等大意味着每个〜4k行,太慢意味着〜3秒(在第一次加载时,在Redis缓存之前。)请记住,页面上还有其他查询。
实际上,是的,我们只需要B.one_field,但是尝试了Prefetch('bees', queryset=B.objects.values('one_field'))一个错误后说您不能values在预取中使用。
queryset将用作多选表单域的选项,在这里我们需要用B.field中的额外字符串表示与B有关系的A对象。