Django框架(六):模型(二) 字段查询、查询集

1. 字段查询

通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。


函数名


功能


返回值


说明


get


返回表中满足条件的一条且只能有一条数据。


返回值是一个模型类对象。


参数中写查询条件。

1)如果查到多条数据,则抛异常MultipleObjectsReturned。

2)查询不到数据,则抛异常:DoesNotExist。


all


返回模型类对应表格中的所有数据。


返回值是QuerySet类型


查询集


filter


返回满足条件的数据。


返回值是QuerySet类型


参数写查询条件。


exclude


返回不满足条件的数据。


返回值是QuerySet类型


参数写查询条件。


order_by


对查询结果进行排序。


返回值是QuerySet类型


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

get、all前面已经使用过了,下面主要讲解filter、exclude和order_by的使用。

准备数据:

index.html:

<html>
<head>
    <title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i.id}}<br>
{{i.btitle}}<br>
{{i.bpub_date}}<br>
{{i.bread}}<br>
{{i.bcomment}}<br>
{%endfor%}
</body>
</html>

我们后面的查询只需要在views.py中修改代码就行了。

1.1 查看mysql数据库日志

为了方便查看查询结果,我们先配置下,让系统生成mysql日志文件。

我使用的是mysql5.7版本,其他版本可以参考这个,但是建议是自己去百度。

查看mysql数据库日志可以查看对数据库的操作记录需要做如下配置:

首先查看是否开启了binlog:show binary logs;

发现没有开启logs,那么我们就可以开始配置了。

我们要去C:\ProgramData\MySQL\MySQL Server 5.7路径下找到my.ini文件。

然后编辑这个文件,我们可以使用搜索功能。

修改成这样:

# Binary Logging.
log-bin=mysql-bin
binlog-format=Row

如果不能修改,就使用管理员权限打开。

然后重启mysql服务。

验证binlog是否开启:show variables like ‘log_bin‘; 和 show binary logs;

binlog文件的位置:如果在修改my.ini的binlog时给的是全路径,那么生成的日志文件就在指定的目录下;如果只给一个名字,那么生成的binlog日志的位置为:

如果给的全路径配置为:

log-bin=指定路径\mysql-bin
binlog-format=Row

那么就会在指定路径下生成文件。

1.2 条件运算符

1.2.1 查询

exact:表示判断等于,和 = 差不多。

例:查询编号为1的图书。

list=BookInfo.objects.filter(id__exact=1)

可简写为:

list=BookInfo.objects.filter(id=1)

1.2.2 模糊查询

contains:是否包含。

如果要包含%无需转义,直接写即可。

list = BookInfo.objects.filter(btitle__contains=‘斗‘)

startswith、endswith:以指定值开头或结尾。

例:查询书名以‘天‘结尾的图书。

list = BookInfo.objects.filter(btitle__endswith=‘天‘)

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith。

1.2.3 空查询

isnull:是否为null。

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

list = BookInfo.objects.filter(btitle__isnull=False)

1.2.4 范围查询

in:是否包含在范围内。

例:查询编号为1或3或5的图书。

list = BookInfo.objects.filter(id__in=[1, 3, 5])

1.2.5 比较查询

gt、gte、lt、lte:大于、大于等于、小于、小于等于。

例:查询编号大于3的图书。

list = BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

list = BookInfo.objects.exclude(id=3)

1.2.6 日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询2009年发表的图书。

list = BookInfo.objects.filter(bpub_date__year=2009)

例:查询2008年12月14日后发表的图书。

from datetime import date
...
list = BookInfo.objects.filter(bpub_date__gt=date(2008, 12, 14))

1.3 F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。

语法如下:

F(属性名)

例:查询阅读量大于等于评论量的图书。

from django.db.models import F
...
list = BookInfo.objects.filter(bread__gte=F(‘bcomment‘))

可以在F对象上使用算数运算。

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

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

1.4 Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

例:查询阅读量大于20,并且编号小于3的图书。

list=BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。

语法如下:

Q(属性名__运算符=值)

例:查询阅读量大于20的图书,改写为Q对象如下。

from django.db.models import Q
...
list = BookInfo.objects.filter(Q(bread__gt=20))

Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现。

list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

Q对象前可以使用~操作符,表示非not。

例:查询编号不等于3的图书。

list = BookInfo.objects.filter(~Q(pk=3))

1.5 聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。

例:查询图书的总阅读量。

from django.db.models import Sum
...
sum = BookInfo.objects.aggregate(Sum(‘bread‘))

修改界面

<html>
<head>
    <title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>

{{sum}}<br>

</body>
</html>

以及

from django.shortcuts import render
from booktest.models import BookInfo
from django.db.models import Sum

def index(request):
    sum = BookInfo.objects.aggregate(Sum(‘bread‘))

    context = {‘title‘: ‘图书列表‘, ‘sum‘: sum}
    return render(request, ‘booktest/index.html‘, context)

注意aggregate的返回值是一个字典类型,格式如下:

{‘聚合类小写__属性名‘:值}
如:{‘sum__bread‘:3}

使用count时一般不使用aggregate()过滤器。

例:查询图书总数。

count = BookInfo.objects.count()

参照上面修改代码

注意count函数的返回值是一个数字。

2. 查询集

查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。

返回查询集的过滤器如下:

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
  • order_by():对结果进行排序。

返回单个值的过滤器如下:

  • get():返回单个满足条件的对象

    • 如果未找到会引发"模型类.DoesNotExist"异常。
    • 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
  • count():返回当前查询结果的总条数。
  • aggregate():聚合,返回一个字典。

判断某一个查询集中是否有数据:

  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

2.1 两大特点

  • 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
  • 缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

示例:查询所有,编辑booktest/views.py的index视图,运行查看。

list=BookInfo.objects.all()

2.2 查询集的缓存

每个查询集都包含一个缓存来最小化对数据库的访问。

在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。

演示:运行项目shell。

python manage.py shell

情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。

from booktest.models import BookInfo
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]

情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据。

list=BookInfo.objects.all()
[book.id for book in list]
[book.id for book in list]

2.3 限制查询集

可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。

注意:不支持负数索引。

对查询集进行切片后返回一个新的查询集,不会立即执行查询。

如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。

示例:获取第1、2项,运行查看。

list=BookInfo.objects.all()[0:2]

原文地址:https://www.cnblogs.com/liuhui0308/p/12207595.html

时间: 2024-11-08 21:20:02

Django框架(六):模型(二) 字段查询、查询集的相关文章

django框架之模型

ORM简介 ORM,全拼Object-Relation Mapping,中文意为对象-关系映射,是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据.内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系.因此,对象-关系映射ORM系统一般以中间件的形式存在,主

Django框架介绍(二)

1.MVC框架和MTV框架 MVC全名model view controller,是软件工程中的一种软件架构模式,把软件分为三个基本部分:模型(model).视图(view)和控制器(controller),具有耦合性低,重用性高.生命周期成本低等优点 django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性 django框架的不同之处自安于它拆分的三部分为:model(模型),template(模板),view视图:django使用的框架为MTV Djang

Django框架之模型层 常用字段和参数

目录 一.Django ORM 常用字段和参数 1.1 常用字段 1.2 所有字段(争取记忆) 1.2.1 orm字段与MySQL字段对应关系 1.3 自定义字段 1.3 字段参数 1.3.1 DateField和DateTimeField的字段参数 二.关系字段 2.1 ForeignKey 2.1.1 字段参数 2.1.2 其余字段参数 2.2 OneToOneField 2.2.1 字段参数 2.3 ManyToManyField 2.3.1 字段参数 一些说明: 表的名称是自动生成的,如

tp框架根据不同的字段进行查询

$map['id|username'] = array(intval($keyword),array('like', '%' . $keyword . '%'),'_multi' => true);return Array ( [id|username] => Array ( [0] => 1932000 [1] => Array ( [0] => like [1] => %1932000% ) [_multi] => 1 ) )  

python3开发进阶-Django框架的ORM常用字段和参数

阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.  (最大十位) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. DateField 日期字段,

Django框架---model模型基础

ORM 映射关系: 表名  <-------> 类名 字段  <-------> 属性 表记录 <------->类实例对象 回到顶部 创建表(建立模型) 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email. 书籍模型: 书籍有书名和出版日期,一本书可能会有多个

django框架的模型类定义及操作

在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库. 使用MySQL数据库首先需要安装驱动程序 pip install PyMySQL 在Django的工程同名子目录的__init__.py文件中添加如下语句 from pymysql import install_as_MySQLdb install_as_MySQLdb() 作用是让Django的ORM能以mysqldb的方式来调用PyMySQL. 修改DATABASES配置信息 DATABA

Django框架基础(二)

MODELS 1 对数据库起效的字段设置: 2 数据类型:CharField 3 IntegerField 4 FloatField 5 DecimalField(max_digits=30,decimal_places=10) 6 DateTimeField 7 8 9 字段参数:null=True default='' unique=True db_index=True premary_key 10 class Meta: 11 unique_together=( 12 ('email','

django框架学习:二十四.django表单post登录案例

前言 上一篇学习了注册案例,今天学习一下post登录案例,注册是往数据库插入数据,登 录是从数据库里面查询数据. 注册页面 新建HTML文件,表单提交页面包含name,age,qq,psw,提交. 页面显示如下: 注册页面视图函数 通过表单提交的请求数据,先去数据库进行查询,如果有返回用户名已经存在,如果没有此用户名在数据库创建保存提交的数据,密码psw为了安全需要进行加密处理. 密码加密make_password from django.contrib.auth.hashers import