【问题标题】:Django Query: How to use sql "union" and "not in" functionDjango Query:如何使用 sql "union" 和 "not in" 函数
【发布时间】:2014-04-22 16:40:42
【问题描述】:

如何在 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 查询。

谢谢

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    也许您应该只添加 __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
    

    【讨论】:

    • 你能给我一些链接或书籍来理解查询
    • @AskQuestion 实际上 Django 文档 (docs.djangoproject.com/en/1.6/topics/db/queries) 对我来说已经绰绰有余了。你可以在谷歌上搜索一些额外的技巧(比如联合的东西),但我通常认为,如果你需要一些真正花哨和不寻常的东西,那首先这可能是个坏主意。
    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-07
      • 2013-08-24
      • 2020-12-24
      相关资源
      最近更新 更多