基本查询
get查询
get查询的是单一结果,如果不存在会抛出模型类名.Does.Not.Exist
异常。
BookInfo.objects.get(id=1)
all查询
all查询的是多个结果。返回类型是一个查询集,可迭代。
BookInfo.objects.all()
count查询
count查询的是结果的数量
BookInfo.objects.count()
过滤查询
filter查询
filter过滤出多个结果。过滤条件的表达式:属性名称__比较运算符=值
- exact:相等
BookInfo.objects.filter(id__exact=1)
- contains:模糊查询,是否包含。
BookInfo.objects.filter(name__contains='传')
- startwith:以指定值开头
BookInfo.objects.filter(name__startswith='部')
- endwith:以指定值结尾
BookInfo.objects.filter(name__endswith='部')
注:以上运算符严格区分大小写,在运算符钱加上i
不区分大小写,比如iexact。
- isnull:空查询,是否为null。
BookInfo.objects.filter(name__isnull=True)
- in:范围查询,是否包含在范围内。
#查询id是否包含在1 3 5内的对象
BookInfo.objects.filter(id__in=[1,3,5])
- gt:比较查询,大于。
BookInfo.objects.filter(id__gt=3)
- gte:比较查询,大于等于。
BookInfo.objects.filter(id__gte=3)
- lt:比较查询,小于。
BookInfo.objects.filter(id__lt=3)
- lte:比较查询,小于等于。
BookInfo.objects.filter(id__lte=3)
- exclude:比较查询,排除。
BookInfo.objects.exclude(id=3)
- 日期查询:
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
BookInfo.objects.filter(pub_date__year=1980)
F和Q对象
- F对象
F对象主要用于两个字段的比较;基本语法:A模型字段__运算符=F(B模型字段)
BookInfo.objects.filter(bread__lte=F('bcommet'))
django还支持对F()对象使用算数运算
BookInfo.objects.filter(bread__lte=F('bcommet')*2)
BookInfo.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))
- Q对象
在查询中需要进行or(或)查询,使用Q对象;基本语法:
或:Q(字段__运算符=)|Q(字段__运算符=)
与:Q(字段__运算符=)&Q(字段__运算符=)
非:~Q(字段__运算符=)
BookInfo.objects.filter(Q(pk__lt=6) | Q(bcommet__gt=10))
聚合函数和关联查询
- 聚合函数
使用aggregate()函数返回聚合函数的值,常用的聚合函数有:Avg,Count,Max,Min,Sum
from django.db.models import Max
BookInfo.objects.aggregate(Max('bpub_date'))
- 关联查询
一对多查询,语法:实例名(一方模型类对象).反向查询的模型类名(多方的模型类名)小写_set(也就是related_name)
.all()
条件筛选(已知主表数据查询从表数据):filter(外键__字段__运算符=值)
book = BookInfo.objects.get(id=1)
book.heroinfo_set.all() #模型类:HeroInfo
多对一查询,语法:实例名.外键名[.字段]
条件筛选(已知从表数据查询主表数据):filter(关联模型类名小写__字段__运算符=值)
person = HeroInfo.objects.get(id=1)
person.hbook #hbook为该模型类中的外键
分页
Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中;
Paginator对象:Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数
from django.core.paginator import Paginator
books = BookInfo.objects.all()
p = Paginator(books,2)
p.page(2)[0]#通过索引取值;Paginator对象的page()方法返回Page对象,不需要手动构造