查询
(文章末尾附上了该视图views.py对应的模型类models.py内容)
查询集
1.查询集表示从数据库中获取的对象集合
2.查询集可以含有零个、一个或多个过滤器
3.过滤器基于所给的参数限制查询的结果
4.在管理器上调用过滤器方法会返回查询集
5.查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
6.惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库
7.何时对查询集求值:迭代,序列化,与if合用
8.返回查询集的方法,称为过滤器
all()
filter()
exclude()
order_by()
values()
9.过滤器书写格式:
filter(键1=值1,键2=值2) 等价于下面
filter(键1=值1).filter(键2=值2)
高级使用方法见下面比较运算符
10.查询集返回的是一个类列表,可以使用下标可以获取对应的对象,也支持切片,但不支持负下标
查询返回单个值
get():返回单个满足条件的对象
如果未找到会引发"模型类.DoesNotExist"异常
如果多条被返回,会引发"模型类.Multiple ObjectsReturned"异常
count():返回当前查询的总条数
first():返回第一个对象
last():返回最后一个对象
exists():判断查询集中是否有数据,如果有则返回True
比较运算符
配合过滤器filter()、exclude()、get()使用
格式:属性名称__比较运算符=值
exact:表示判断是否等于
contains:包含
startswith,endswith:以value开头或结尾
上面的参数默认是大小写敏感的,在前面加个i可以忽略大小写如:iexact,icontains、istarswith、iendswith
isnull、isnotnull:是否为null
in:是否包含在范围内
in:是否包含在范围内
year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算
代码示例
# 查询英雄表中,hcontext字段中包含‘九’的所有信息
# list_info = HeroInfo.objects.filter(hcontent__contains='九')
# 查询英雄表中,没有被逻辑删除的所有数据,filter:过滤
# list_info = HeroInfo.objects.filter(isDelete=False)
# 列表list_info包含的数据个数
# count = list_info.count()
# 排除名字以 ‘风’ 结尾的,exclude:排除
# list_info = HeroInfo.objects.exclude(hname__endswith='风')
# 名字不是空的
# list_info = HeroInfo.objects.filter(hname__isnull=False)
# gt、gte、lt、lte:大于、大于等于、小于、小于等于;
# in: 是否包含在in的范围内,主键写id或者pk都可以
# list_info = BookInfo.books.filter(id__in=[1,2])
# list_info = HeroInfo.objects.filter(pk__in=[18,19,20])
# 跨关联查询,查询书中的英雄的内容中包含‘九’的书。
list_info = BookInfo.books.filter(heroinfo__hcontent__contains='九')
context = {'list':list_info}
return render(request, 'booktest/index.html', context)
聚合函数
使用aggregate()函数返回聚合函数的值
聚合函数:Avg,Count,Max,Min,Sum
聚合函数在查询集的最后面写,Count不用aggregate()返回值,可以直接调用
list_info = HeroInfo.objects.exclude(hname__endswith='风')
max = list_info.aggregate(Max(pk))
count = list_info.count()
F 对象
用来比较一个字段和另一个字段的值,即一个对象的一个属性和另一个属性的值.
# books是BookInfo的类属性保存的自定义的一个管理类的对象.
# 查询阅读量大于评论量的对象
result = BookInfo.books.filter(bread__gt=F('bcommet'))
Q 对象,
过滤器的方法中关键字参数查询,可以实现多个条件的逻辑或
或查询
BookInfo.books.filter(Q(判断一) | Q(判断2))
与查询
result = BookInfo.books.filter(pk__lt=5,(bcommet__lt=10)
模型类内容
# models.py
from django.db import models
class BookInfoManage(models.Manager):
def get_queryset(self):
return super(BookInfoManage,self).get_queryset().filter(isDelete=False)
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateTimeField(db_column='pub_date')
bread = models.IntegerField(default=0)
bcommet = models.IntegerField(default=0)
isDelete = models.BooleanField(default=False)
books = models.Manager()
books2 = BookInfoManage()
class Meta():
db_table = 'bookinfo'
def __str__(self):
return self.btitle.encode('utf-8')
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField(default=True)
hbook = models.ForeignKey('BookInfo')
hcontent = models.CharField(max_length=100)
isDelete = models.BooleanField(default=False)
def __str__(self):
return self.hname.encode('utf-8')