Django day04-查询函数

重定向

就是通过各种方法将各种网络请求重新定个方向转到其它位置。在Django中,需要加载HttpResponseRedirect或redirect模块来实现重定向。

from django.http import HttpResponseRedirect
def demo(request):
	return HttpResponseRedirect('/index')

以上代码等价于

from djang.shortcuts import redirect
def demo(request):
	return redirect('/index')

字段属性和选项

参考Django文档1.8.2:https://yiyibooks.cn/xx/django_182/index.html

对比null和blank
null是数据库范畴的概念,而blank是后台管理页面表单验证范畴的。

注意:当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移。defalut和blank不影响表结构。

1.启动mysql日志

1.修改mysql的日志文件,让其产生mysql.log,即是mysql的日志文件,里面记录的对MySQL数据库的操作记录。
a)使用命令打开mysql的配置文件,去除68,69行的注释,然后保存。

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

b)重启mysql服务,就会产生mysql日志文件

sudo service mysql restart

c)打开MySQL的日志文件

/var/log/mysql/mysql.log

d)实时查看mysql的日志文件

sudo tail -f /var/log/mysql/mysql.log

2.查询函数

在Django中,通过 模型类.objects 属性可以调用如下函数,实现对模型类对应的数据表的查询,查询条件格式为:模型类属性名__条件名=值。
注意:假设模型类BookInfo对应的数据表名为BookInfo、对一个表的所有数据进行查询的话模型类.objects.all()中的.all()可以省略。

1)get:返回表中满足条件的一条且只能有一条数据,返回值是一个 模型类对象

模型类.objects.get(参数)

说明:参数中写查询条件。如果查询到多条数据,则会抛出异常 MultipleObjectsReturned ;如果查询不到数据,则会爬出异常 DoesNotExist

2)all:返回模型类对应表格中 所有模型类对象 ,返回值是 QuerySet类型(即查询集对象)

模型类.objects.all()

说明:返回的是一个查询集对象可以进行遍历。

3)filter:返回 满足条件的数据,返回值是 QuerySet类型

模型类.objects.filter(参数)

说明:参数里写查询条件。

a)判等。exact
例:查询id为1的图书
注意:这里使用的是get,因为返回的只有一条数据。

BookInfo.objects.get(id__exact=1)
等价于SQL语句:
select * from BookInfo where id=1;

b)模糊查询
例:查询书名包含‘森林’的图书。contains
注意:这里使用的filter,因为返回的可能不止一条数据。

BookInfo.objects.filter(btitle__contains='森林')
等价于SQL语句:
select * from BookInfo where btitle like '%森林%';

例:查询书名以‘挪威’结尾的图书。endswich

BookInfo.objects.filter(btitle__endswich='挪威')
等价于SQL语句
select * from BookInfo where btitle like '挪威%';

例:查询书名以“孤独”开头的图书。startswich

BookInfo.objects.filter(btitle__startswich='孤独')
等价于SQL语句
select * from BookInfo where btitle like '%孤独';

c)空查询 isnull
例:查询书名不为空的图书。

BookInfo.objects.filter(btitle__isnull=False)
等价于SQL语句
select * from BookInfo where btitle is not null;

d)范围查询 in
例:查询id为1或3或5的图书。

BookInfo.objects.filter(btitle__in = [1, 3, 5])
等价于SQL语句
select * from BookInfo where id in (1,3,5);

e)比较查询 gt、lt、gte、lte
大于 gt(greate than)
小于 lt(less than)
大于等于 gte(greate than equal)
小于等于 lte(less than equal)
例:查询id大于3的图书。

BookInfo.objects.filter(id__gt=3)
等价于SQL语句
select * from BookInfo where id>3;

f)日期查询。year、month、day
例:查询1987年发表的图书。

BookInfo.objects.filter(bpud_date__year=1987)
等价于SQL语句
select * from BookInfo where bpud_date between 1987-1-1 and 1987-12-31;

例:查询1月发表的图书。

BookInfo.objects.filter(bpud_date__month=1)
等价于SQL语句
select * from BookInfo where extract (month from BookInfo.bpud_date) = 5;

例:查询10日发表的图书。

BookInfo.objects.filter(bpud_date__day=10)
等价于SQL语句
select * from BookInfo where extract (day from BookInfo.bpud_date) = 10;

例:查询1987年1月1日后发表的图书。

BookInfo.objects.filter(bpud_date__gt=date(1987,1,1))
等价于SQL语句
select * from BookInfo where BookInfo.bpud_date>1987-1-1;

4)exclude:返回 不满足条件的数据,返回值是一个 QuerySet类型

模型类.objects.exclude(参数)

说明:参数写查询条件。

例:查询id不为3的图书。exclude

BookInfo.objects.exclude(id=3)
等价于SQL语句
select * from BookInfo where id != 3;

5)order_by:对查询结果进行 排序,返回值是一个 QuerySet类型

模型类.objects.order_by(参数)

说明:参数中写根据哪些字段进行排序。

例:查询所有图书的信息,按照id从小到大排序

BookInfo.objects.all().order_dy('id')
等价于SQL语句
select * from BookInfo order by id asc;

例:查询所有图书的信息,按照id从大到小排序

BookInfo.objects.all().order_dy('-id')
等价于SQL语句
select * from BookInfo order by id desc;

例:查询id大于3的图书信息,按照阅读量从大到小排序

BookInfo.objects.filter(id__gt=3).order_dy('-bread')
等价于SQL语句
select * from BookInfo where id>3 order by bread desc;

3.Q对象

作用:用于查询时条件之间的逻辑关系 ,可以对Q对象进行操作and、or、not
使用之前需要先导入:

from jango.db.models import Q

例:查询id大于3且阅读量大于30的图书的信息
& 代表且,即SQL语句的and

BookInfo.objects.filter(id__ge=3, bread__gt=30)
或
BookInfo.objects.filter(Q(id__ge=3) & Q(bread__gt=30))
以上两天代码等价于SQL语句
select * from BookInfo where id>3 and bread>30;

例:查询id大于3或者阅读量大于30的图书的信息
| 代表或,即SQL语句的or

BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))
等价于SQL语句
select * from BookInfo where id>3 or bread>30;

例:查询id不等于3的图书信息
~ 代表非,即SQL语句的not

BookInfo.objects.filter(~ Q(id=3))
等价于SQL语句
select * from BookInfo where not id=3;

4.F对象

作用:用于类属性之间的比较。
使用之前需要先导入:

from django.db.models import F

例:查询图书阅读量大于评论量的图书信息

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查询图书阅读量大于2倍评论量的图书信息

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

5.聚合函数

作用:对查询结果进行聚合操作。sum、count、avg、max、min。
提前是需要调用aggregate()函数来使用,其返回值是一个字典
使用前需要先导入集合类

from django.db.models import Sum, Count, Max, Min, Avg

例:查询所有图书的数目
返回值是:{‘id__count’:5}

BookInfo.objects.all().aggregate(Count('id'))
等价于SQL语句
select count(id) as id__count from BookInfo;

例:查询所有图书阅读量的总和
返回值是:{‘bread__sum’:126}

BookInfo.objects.all().aggregate(Sum('bread'))
等价于SQL语句
select sum(bread) as bread__sum from BookInfo;

count函数
作用:统计满足条件数据的数量,其返回值是 一个数字
例:统计所有图书的数量。
其返回值是:5

BookInfo.objects.all().count()
等价于SQL语句
select count(*) from BookInfo;

例:统计id大于3的所有图书的数量
其返回值是:2

BookInfo.objects.filter(id__gt=3).count();
等价于SQL语句
select count(*) from BookInfo where id>3

6.查询集(QuerySet)

说明:all、filet、exclude、order_by等函数的调用会产生一个查询集,即QuerySet类型。

查询集的特性
1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
2)缓存:当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,并把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。

限制查询集
可以对一个查询集进行取下标或切片操作来限制查询集的结果。若对一个查询集进行切片操作会产生一个新的查询集,并且下标不允许为负数。
1)取下标:
返回的是一个对象。若b[0]不存在,会抛出IndexError异常。

b = BookInfo.objects.all()
b[0]

2)切片:
返回的是一个新的查询集。若b[0: 1].get()不存在,会抛出DoseNotExist异常。

b = BookInfo.objects.all()
b[0: 1].get()

exists:判断一个查询集中是否有数据。其返回值是一个Boolean类型,即True或False。
有数据返回True,无数据返回False。

b = BookInfo.objects.all()
b.exists()

总结

get:返回有且只有 一条数据,返回值是一个 对象,参数可以写查询条件。

all:返回模型类对应表的 所有数据,返回值是一个 QuerySet类型

filter:返回 满足条件的数据,返回值是一个 QuerySet类型,参数可以写查询条件。

exclude:返回 不满足条件的数据,返回值是一个 QuerySet类型,参数可以写查询条件。

order_by:对查询结果进行 排序,返回值是一个 QuerySet类型,参数写排序一个或多个的字段。

以下3中方法需要先导入模块:
from django.db.models import F, Q, Sum, Count, Avg, Max, Min
F对象:用于 **类属性(即字段)**之间的比较。

Q对象:用于 条件之间逻辑关系(and、or、not)

aggregate:进行 聚合操作,返回值是一个 字典
count:返回结果集中 数据的数量,返回值是一个 数字

贴士:如果返回值是一个QuerySet实例对象,那么就可以继续使用上面的所有函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值