django中带有额外条件的左外连接

Posted

技术标签:

【中文标题】django中带有额外条件的左外连接【英文标题】:Left outer join with extra conditions in django 【发布时间】: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)

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于django中带有额外条件的左外连接的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:具有多个条件的左外连接

使用 LINQ 查询语法 EF Core C# 的左外连接

左外连接与右外连接区别?

关于数据库的左外连接 右外连接的意思是啥

linq中的左外连接

只有第一行的左外连接