使用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)
答案 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()