常用模糊查询的方法
queryset中支持链式操作
book=Book.objects.all().order_by('-nid').first()
只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象本身
模糊查询常用的操作
大于、大于等于:
__gt
大于>
__gte
大于等于>=
Student.objects.filter(age__gt=10)
// 查询年龄大于10岁的学生
Student.objects.filter(age__gte=10)
// 查询年龄大于等于10岁的学生
特别注意:这里的下划线是双下划线,下面将介绍的也都是双下划线。
小于、小于等于:
__lt
小于<
__lte
小于等于<=
Student.objects.filter(age__lt=10)
// 查询年龄小于10岁的学生
Student.objects.filter(age__lte=10)
// 查询年龄小于等于10岁的学生
like:
__exact
精确等于 like ‘aaa’
__iexact
精确等于 忽略大小写 ilike ‘aaa’
__contains
包含 like ‘%aaa%’
__icontains
包含,忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
in:
__in
查询年龄在某一范围的学生
Student.objects.filter(age__in=[10, 20, 30])
is null / is not null:
__isnull
判空
Student.objects.filter(name__isnull=True)
// 查询用户名为空的学生
Student.objects.filter(name__isnull=False)
// 查询用户名不为空的学生
不等于/不包含于:
Student.objects.filter().excute(age=10)
// 查询年龄不为10的学生
Student.objects.filter().excute(age__in=[10, 20])
// 查询年龄不在 [10, 20] 的学生
其他常用模糊查询:
__startswith
以…开头
__istartswith
以…开头 忽略大小写
__endswith
以…结尾
__iendswith
以…结尾,忽略大小写
__range
在…范围内
__year
日期字段的年份
__month
日期字段的月份
__day
日期字段的日
Book.objects.filter(create_time__year=2019, create_time__month=4).all()
如果是mysql数据库settings里面修改 USE_TZ = False
多表连接查询:
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')
#查询B表中外键aa所对应的表中字段name包含searchtitle的B表对象
查询API
all(): 查询所有结果
filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
order_by(*field): 对查询结果排序 用法:order_by('-price') DESC 降序
reverse(): 对查询结果反向排序
count(): 返回数据库中匹配查询(QuerySet)的对象数量。
first(): 返回第一条记录
last(): 返回最后一条记录
exists(): 如果QuerySet包含数据,就返回True,否则返回False 相当于limit 1(用途查询这个表中是否有值)
values(*field): 用法:Book.objects.all.values('title','price') 返回值是<queryset[{'title':'aa','pirce':12},{}]
values_list(*field): 用法:Book.objects.all.values_list('title','price') 返回值是<queryset[('aa',12),('bb',33)]
distinct(): 从返回结果中剔除重复纪录 用法:Book.objects.all.values('title','price').distinct()
错误用法 Book.objects.all.distinct() 因为id不相同,其他相同,无法去重
查询案例
比如要分组查询
select primary_industry, count(*) as num from tonghsquotes_stockcompanyinfo a GROUP BY a.primary_industry ORDER BY num desc;
用orm实现
StockCompanyInfo.objects.all().values('primary_industry').annotate(num=Count('*')).order_by('-num')