Django中常用数据操作相关方法与常用查询条件

Django中常用数据查询相关操作

数据操作相关方法

支持链式操作的方法

方法名 说明
all() 查询表中所有的数据
eg:Model.objects.all()
filter(查询条件) 查询表中满足条件的所有数据
eg:Model.objects.filter(name=‘张三’) 查询所有name等于’张三’的数据
具体查询条件下方另行介绍
exclude(查询条件) 与filter()逻辑相反。查询表中满足条件之外的所有数据
eg:Model.objects.exclude(name=‘张三’) 查询所有name不等于’张三’的数据
具体查询条件下方另行介绍
reverse() 将查询结果翻转排序
eg:Model.objects.all().reverse()
distinct() 去重查询。SQL为SELECT DISTINCT…
eg:Model.objects.all().distinct()
none() 返回空的查询结果
eg:Model.objects.all().none()
order_by(字段名1, 字段名2) 根据指定字段对查询结果排序,字段名前带"-"代表降序
eg:Model.objects.all().order_by(‘id’)

不支持链式操作的方法

方法名 说明
get(查询条件) 获取一条满足条件的数据
eg:Model.objects.get(id=1) 获取id=1的数据
create() 直接创建一个Model对象
eg:Model.objects.create(name=‘名称’) 创建一条name为’名称’的数据
bulk_create() 同create,用来批量创建数据。
get_or_create() 根据条件查找,如果没查找到,就调用create创建。
eg:Model.objects.get_or_create(name=‘名称’)
update_or_create() 与get_or_create相同,只是用来做更新操作。
eg:Model.objects.update_or_create(name=‘名称’)
count() 返回查询到的数据条数,可带条件查询
eg:Model.objects.filter(name=‘张三’).count() 获取所有name=张三的数据条数
latest() 返回最新的一条数据,但要在Model的Meta中定义:get_latest_by= <用来排序的字段>
earliest() 同latest(),返回最早的一条数据。
first() 从当前查询结果中获取第一条数据
eg:Model.objects.all().first()
last() 同first(),从当前查询结果中获取最后一条数据
eg:Model.objects.all().last()
exists() 判断当前查询是否存在结果。返回True或者False
如果只是需要判断查询结果是否有数据,用这个接口是最合适的方式。
eg:Model.objects.all().exists()
in_ bulk(查询条件) 批量查询,接收两个参数id_ list和filed_ name。
eg:Model.objects.in_bulk([1, 2])获取id为1、2的数据。
返回结果是字典类型,字典类型的key为查询条件。返回结果示例: {1: <实例1>, 2: <实例2>}
update() 更新数据
delete() 删除数据
values([字段名1, 字段名2]) 只返回数据的指定字段,不填时返回所有。返回类型为dict
eg:Model.objects.filter(status=1).values(‘name’) 获取status=1的数据所有name字段
返回示例:<QuerySet [{‘name’: ‘张三’}, {‘name’: ‘李四’}, {‘name’: ‘王二’}]>
values_list([字段名1, 字段名2]) 同values()。返回类型为tuple
eg:Model.objects.filter(status=1).values(‘name’) 获取status=1的数据所有name字段
返回示例:<QuerySet [(‘张三’,), (‘李四’,), (‘王二’,)]>

进阶方法

方法名 说明
defer() 把不需要展示的字段做延迟加载。但是当我们需要用到这个字段时,在使用时会去加载(产生额外的查询)。
会产生N+1的查询问题
only() 同defer接口刚好相反, 如果只想获取到所有的某个字段的数据,就可以使用only,其他值在获取时会产生额外的查询。
select_related() 用来解决一对多关联关系下产生的N+1问题
prefetch_related() 用来解决多对多关联关系下产生的N+1问题

常用数据查询条件

查询条件 说明 对应SQL中的查询
exact 精确查找
eg:Test.objects.filter(id__exact=14)
对应SQL:select * from test where id = 14
=
iexact 使用like精确查找
eg:Test.objects.filter(name__exact=‘张’)
对应SQL:select * from test where name like '张’
注意:此处like两边没有%
like
contains 模糊搜索,大小写敏感
eg:Test.objects.filter(name__contains=‘张’)
对应SQL:select * from test where name like '%张%'
注意:此处like两边有%
like
icontains 同contains,忽略大小写 like
in 查询在指定集合中的数据,可以为list、tuple或者任何一个可迭代的对象
eg:Test.objects.filter(id__in=[1, 2, 3])
对应SQL:select * from test where id in (1,2,3)
in
gt 大于
eg:Test.objects.filter(id__gt=10)
对应SQL:select * from test where id > 10
>
gte 大于等于 >=
lt 小于 <
lte 小于等于 <=
startwith 查询字段以某个值开始的所有数据,大小写敏感
eg:Test.objects.filter(title__startwith=‘te’)
对应SQL:select * from test where title like ‘te%’
like
istartwith 同startwith,忽略大小写 like
endswith 查询字段以某个值结束的所有数据,大小写敏感
eg:Test.objects.filter(title__endswith=‘te’)
对应SQL:select * from test where title like ‘%te’
like
iendswith 同endswith,忽略大小写 like
range 范围查询
eg:Test.objects.filter(score__range=(70, 85))
对应SQL:select * from test where score between 70 and 85
between and
isnull 范围查询
eg:Test.objects.filter(name__isnull=False)
对应SQL:select * from test where name is not null
is null / is not null

进阶查询条件

查询条件 说明
F 常用来执行数据库层面的计算
eg:test = Test.objects.get(id=1);test.num = F(‘num’) + 1;test.save()
对应SQL:update test set num = num +1 where id = 1
Q 对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。
eg:test = Test.objects.filter(Q(id=1) | Q(id=2))
对应SQL:select * from test where id=1 or id=2
Count、Sum、Sum、Min、Max等 聚合查询
eg:test = Test.objects.all().aggregate(total=Sum(‘num’))
对应SQL:select sum(num) as total from test
aggregate表示只用来直接计算结果。还有一个annotate用来給QuerySet结果増加属性
上一篇:NX二次开发-获取加工导航器上选中刀具或工序的所有paramIndex值


下一篇:20200115 java.util.Objects