Django 用户认证 用户 邮箱登录 邮箱注册 ORM or,and,not form.py FORM ModelForm Paginator 分页 HTMl JQuery 定位元素 ajax django切片 restfulapi 跨域 Ubantu Python Mysql Scrapy 爬虫 导出 Python读写 Pycharm 破解 session re sqlit3 生成式 其他 Prism 富文本 CSS Nginx 部署 请求头 抓包 协议 selenium Ubuntu 宝塔 AI Comfy-ui ollama dify open-webui Git docker
如何在Django ORM中进行 or、and、not查询?(Q的用法)
张建行 2021年4月6日 15:47 17 文章标签: Django 用户认证 ORM or,and,not

假如我们在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文件中,我这里直接在终端进行调试

  1. 第一种or查询方法:

  2. queryset_1 | queryset_2
  3. 第二章or查询方法:

  4. 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()方法

from django.db.models import Q
qs6 = User.objects.filter(~Q(id=1))
# 输出及输出结果
print(qs6)
<QuerySet [<User: yonghu1>, <User: yonghu2>, <User: yonghu3>]>