小编Dav*_*eza的帖子

Django ORM在一个查询中加入多对多关系

如果我们有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对象。

django postgresql django-models django-orm

4
推荐指数
1
解决办法
877
查看次数

标签 统计

django ×1

django-models ×1

django-orm ×1

postgresql ×1