我在使用 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)
我在使用 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)
我想你可能一直在寻找这个Prefetch
物体,但它在 5 年前可能并不存在。无论如何,这是现在实现它的一种方式。
您需要在这两个位置使用过滤器,以确保获得适当的 T1 和 T2 实例。然后 Prefetch 实际上会做一个额外的查询来拉取所有相关的 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()