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

标签 django left-join django-orm django-queryset

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

关于django - django 中带有额外条件的左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18682065/

相关文章:

mysql - 如何获得连接的对立面?

Django QuerySet过滤器方法为一条记录返回多个条目

python - 单个django查询集获取n个相邻项目

Django orm 按多列分组

python - 检查文本是否以空格开头

python - 如何在Django中将unique=true的外键设置为 "optional"?

Django 注册 登录用户数

python - 如何处理 Python 多处理数据库并发,特别是使用 django?

sql - 左连接和左外连接有什么区别?

Mysql left join只在一个表中使用where子句查询记录