Django查询:如何使用sql的“union”和“not in”功能

6 投票
2 回答
4825 浏览
提问于 2025-04-17 22:39

我想知道在Django查询中怎么使用联合(union)和“不在”(not in)这个功能。我找了很久,但没找到任何例子。

SELECT id,address
    FROM tbl_nt
    WHERE st_id IN (1,2) AND name = 'foo'
    UNION (
        SELECT d.id,d.addrses
            FROM tbl_nt_123 d
            WHERE d.name='foo' AND condition_id NOT IN (
                SELECT condition_id 
                    FROM tbl_conditions
                    WHERE version_id = 5
            )
    )

我试过这个查询,但下半部分没成功。

tbl_nt_123.objects.values_list('id', 'address').exclude(
    condition_id=tbl_conditions 
).objects.filter(version_id=5).values_list(
    'condition_id', flat=True)
)

我该怎么做呢?

请给我推荐一些好的链接或书籍,帮助我理解更高级的Django查询。

谢谢!

2 个回答

0

Django的查询集现在有一个叫做.union()的方法。这个方法可以用来合并多个查询的结果,类似于这样:

tbl_nt.objects.filter(st_id__in=(1, 2), name='foo').union(
    tbl_nt.objects.filter(name='foo')
    .exclude(condition__in=Condition.objects.filter(version_id=5))
).values_list('id', 'address')

https://docs.djangoproject.com/en/stable/ref/models/querysets/#union

7

你可能只需要加上 __in 这个查找修饰符就可以了:

tbl_nt_123.objects.values_list('id','address').exclude(
    condition_id__in=tbl_conditions.objects.filter(version_id=5).values_list('condition_id',flat=True))

至于合并,你可以用 | 这个符号来模拟实现。

union = queryset1 | queryset2

撰写回答