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结果増加属性 |