5

我在使用 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)
4

1 回答 1

2

我想你可能一直在寻找这个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()
于 2018-11-16T19:38:52.347 回答