美文网首页Django从入门到精通
如何在Django ORM中进行 or、and、not查询?

如何在Django ORM中进行 or、and、not查询?

作者: 轻编程 | 来源:发表于2020-04-03 18:01 被阅读0次
    1.png

    假如我们在django的admin后台默认添加了如上图所示的几个用户。每个用户拥有username、first_name、last_name等等几个字段。

    or查询

    在项目开发中我们可能有需求要在两个或多个条件下执行过滤,那么他们的过滤关系用中文来讲就是'或'的查询关系,英文成为'or'。假设在本例中你要查找所有以‘编’开头的first_name和‘谢’开头的last_name的所有用户。

    Django为我们提供了两个查询方法:

    • queryset_1 | queryset_2
    • filter(Q(<condition_1>)|Q(<condition_2>))

    来看看,具体的查询代码,一般这些查询代码在视图views.py文件中,我这里直接在终端进行调试

    第一种or查询方法:queryset_1 | queryset_2

    # User是django默认认证授权系统自带的用户模型
    queryset = User.objects.filter(
        # startswith区分大小写,查询的是开头字符
            first_name__startswith='编'
        ) | User.objects.filter(
            last_name__startswith='谢'
        )
    
    # 输出及输出结果
    print(queryset)
    <QuerySet [<User: admin>, <User: yonghu3>]>
    

    第二章or查询方法:filter(Q(<condition_1>)|Q(<condition_2>))

    # 第二种Q查询方法 endswith区分大小写,查询的是结尾字符
    from django.db.models import Q
    qs = User.objects.filter(Q(first_name__endswith='程')|Q(last_name__startswith='谢'))
    
    # 输出及输出结果
    print(qs)
    <QuerySet [<User: admin>, <User: yonghu3>]>
    

    and查询

    and查询指的是查找与多个条件匹配的查询集,中文表达是什么和什么的关系。假设在本例中你要查找first_name以“霆”,last_name以“谢”开头的用户。

    Django提供了三个选项:

    • filter(<condition_1>, <condition_2>)
    • queryset_1 & queryset_2
    • filter(Q(<condition_1>) & Q(<condition_2>))

    第一种and组合多个条件的默认方式filter

    qs1 = User.objects.filter(
            first_name__startswith = '霆',
            last_name__startswith = '谢'
        )
    # 输出及输出结果
    print(qs1)
    <QuerySet [<User: yonghu3>]>
    

    第二种显示的在查询集上使用&运算符。

    qs2 = User.objects.filter(
            first_name__startswith = '霆'
        ) & User.objects.filter(
            last_name__startswith = '谢'
        )
    
    # 输出及输出结果
    print(qs2)
    <QuerySet [<User: yonghu3>]>
    

    第三种完全可定制的使用Q对象。

    from django.db.models import Q
    qs3 = User.objects.filter(
        Q(first_name__startswith = '霆') &
        Q(last_name__startswith = '谢')
        )
    # 输出及输出结果
    print(qs3)
    <QuerySet [<User: yonghu3>]>
    

    not查询

    以本例来讲,假设你要获取除超级管理员以外的所有用户,这里默认的管理员id为1,就需要执行not操作。

    Django提供了两个选项。

    • exclude(<condition>)
    • filter(~Q(<condition>))

    第一种使用默认的exclude排除法。

    qs5 = User.objects.exclude(id=1)
    # 输出及输出结果
    print(qs5)
    <QuerySet [<User: yonghu1>, <User: yonghu2>, <User: yonghu3>]>
    

    第二章使用Q()方法

    qs6 = User.objects.filter(~Q(id=1))
    print(qs6)
    <QuerySet [<User: yonghu1>, <User: yonghu2>, <User: yonghu3>]>
    

    相关文章

      网友评论

        本文标题:如何在Django ORM中进行 or、and、not查询?

        本文链接:https://www.haomeiwen.com/subject/xwykphtx.html