【问题标题】:Left outer join with extra conditions in djangodjango中带有额外条件的左外连接
【发布时间】:2013-09-11 23:42:19
【问题描述】:

我在使用 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 left-join django-orm django-queryset


    【解决方案1】:

    我认为您可能一直在寻找 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2017-07-31
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多