左外连接在django中具有额外条件

时间:2013-09-08 09:02:39

标签: django left-join django-orm django-queryset

使用django queryset + Q对象执行此SQL时遇到问题。

如果没有原始查询,我怎么能这样做?

SELECT *
FROM Table1 T1
LEFT OUTER JOIN Table2 T2 ON T1.id == T2.fk_id AND (T2.VALUE = 'val1' OR T2.VALUE IS NULL)

1 个答案:

答案 0 :(得分:0)

我认为您可能一直在寻找Prefetch对象,但是5年前可能不存在。无论如何,这是现在实现它的一种方式。

在两个位置都需要过滤器,以确保获得适当的T1和T2实例。然后,预取实际上将执行附加查询以提取所有相关的T2实例。区别在于,如果有多个T2实例,就不会有重复的T1实例返回。

from django.db.models import Prefetch
t2_filter = Q(t2_set__value__isnull=True) | Q(t2_set__value='val1')
T1.objects.filter(
    t2_filter,
    t2_set__isnull=False,
).prefetch_related(
    Prefetch(
        't2_set',
        T2.objects.filter(t2_filter),
        to_attr='filtered_t2_set',
    )
).distinct()