from datetime import date
book = BookInfo()
book.btitle = '流浪地球'
book.bpub_date = date(2001,7,1)
book.save()
HeroInfo.objects.create(
hname='txf',
hgender=1,
hbook_id=book.id
)
BookInfo.objects.all()
HeroInfo.objects.count()
HeroInfo.objects.get(id=1)
HeroInfo.objects.get(pk=1)
BookInfo.objects.get(id=188)
实现SQL中的where功能,包括
属性名称__比较运算符=值
exact:表示相等
BookInfo.objects.filter(id__exact=1)
# 可简写为:
BookInfo.objects.filter(id=1)
contains:包含
startswith:以什么开头
endswith:以什么结尾
HeroInfo.objects.filter(hcomment__contains='掌')
HeroInfo.objects.filter(hname__contains='黄')
isnull:空查询
in:范围查询
BookInfo.objects.filter(id__in=[1,3,5])
BookInfo.objects.filter(btitle__isnull=False)
BookInfo.objects.filter(id__gt=2)
# 查询id 不为 1,3,5 的图书信息
BookInfo.objects.exclude(id__in=[1,3,5])
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
# 查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
#查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
from django.db.models import F
# 查询阅读量大于等于评论量的图书。
BookInfo.objects.filter(bread__gte=F('bcomment'))
# 可以在F对象上使用算数运算。查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
# 查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(bread__gt=20,id__lt=3)
# 也可以使用连续查询,因为BookInfo.objects.filter(bread__gt=20)的结果是QuerySet 对象,
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
# 改成Q查询
BookInfo.objects.filter(Q(bread__gt=20)&Q(id__lt=3))
# 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
# 查询编号不等于3的图书。
BookInfo.objects.filter(~Q(pk=3))
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
from django.db.models import Sum
# 查询图书的总阅读量。
BookInfo.objects.aggregate(Sum('bread'))
注意:
aggregate的返回值是一个字典类型,格式如下:
{‘属性名__聚合类小写’:值}
order_by
# 使用order_by对结果进行排序
BookInfo.objects.all().order_by('bread') # 升序
# 降序给排序字段名前加负号 ‘-’
BookInfo.objects.all().order_by('-bread') # 降序
book = BookInfo.objects.get(id=3)
print(book)
# 一对应的模型类对象.多对应的模型类名小写_set
heros = book.heroinfo_set.all()
print(heros)
hero = HeroInfo.objects.get(id=1)
print(hero)
# 多对应的模型类对象.多对应的模型类中的关系类属性名
book = hero.hbook
print(book)
h = HeroInfo.objects.get(id=1)
h.hbook_id
2)、过滤查询
一类名.objects.filter(多类名小写__多类属性名__条件名)
# 查询英雄名包含‘不’的图书
BookInfo.objects.filter(heroinfo__hname__contains='不')
# , ]>
多类名.objects.filter(关联属性__一类属性名__条件名)
# 查询书名为‘雪山飞狐’的所有英雄
HeroInfo.objects.filter(hbook__btitle='雪山飞狐')
#, , , ]>
注意:
①通过模型类实现关联查询时,要查询哪个表中的的数据时,就需要通过哪个表查询
②写关联查询条件时,若果类中没有关系属性,条件需要写对应类的名,如果类中有关系性属性,直接使用关系属性
修改更新有两种方法
修改模型类对象的属性,然后执行save()方法
hero = HeroInfo.objects.get(hname='txf')
hero.hname = '田小芳'
hero.save()
使用模型类.objects.filter().update(),会返回受影响的行数
HeroInfo.objects.filter(hname='jjj').update(hname='django')
删除有两种方法
hero = HeroInfo.objects.get(id=13)
hero.delete()
HeroInfo.objects.filter(id=14).delete()
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
说明:
对一个返回值为查询集的实例,可以继续使用我们前面学的查询函数
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句,不支持负数索引。
获取第1、2项,运行查看。
qs = BookInfo.objects.all()[0:2]