python查看数据的长度_python查看数据的长度


前言

系列文章目录
[Python]目录 视频及资料和课件
链接:https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd=1234 提取码:1234




文章目录

  • 前言
  • 1. shell
  • 2. 新增数据
  • 2.1 方式一:实例化模型类
  • 2.2 方式二:直接新增入库
  • 3. 修改(更新)数据
  • 3.1 方法一:直接修改实例属性
  • 3.2 方法二:直接修改数据
  • 4. 删除数据
  • 4.1 方法一:先查询出指定数据再进行删除
  • 4.2 方法二:先过滤出指定数据再进行删除
  • 5. 查询数据
  • 5.1 基本查询
  • 5.1.1 get()
  • 5.1.2 all()
  • 5.1.3 count()
  • 5.2 过滤查询 filter() & get() & exclude()
  • 5.2.1 运算符
  • 5.2.2 相等
  • 5.2.3 模糊查询
  • 5.2.4 空查询
  • 5.2.5 范围查询
  • 5.2.6 比较查询
  • 5.2.7 日期查询
  • 5.3 F对象(两个属性进行比较)
  • 5.4 Q对象(逻辑或与非查询)
  • 5.4.1 逻辑与查询
  • 5.4.2 逻辑或查询
  • 5.4.3 逻辑非查询
  • 5.5 聚合函数
  • 5.6 排序
  • 5.7 关联查询
  • 5.7.1 由一到多的访问
  • 5.7.2 由多到一的访问
  • 5.7.3 关联查询的筛选
  • 5.8 查询集QuerySet
  • 5.8.1 查询集的特性
  • 5.8.2 限制查询结果集
  • 5.8.3 分页




1. shell

Django的manage工具提供了shell命令,以便可以直接在终端中执行测试python语句。

类似于ipython;
使用shell工具,可以帮助我们更好的测试代码,对于有关模型的代码(数据对象的增删改查)可以使用shell进行测试,就不用书写路由和请求响应到浏览器客户端进行查看。

启动shell,在命令窗口运行:

python manage.py shell

python查看数据的长度_数据库_02

导入两个模型类,并查询两个模型类对应的所有数据对象:

# 导入两个模型类
from book.models import BookInfo,PeopleInfo
# 查询两个模型类对应的所有数据对象
BookInfo.objects.all()
PeopleInfo.objects.all()

python查看数据的长度_django_03

有关模型类的代码写在models.py中,对数据进行增删改查的代码书写在views.py中,对数据进行增删改查需要实例化模型类,在views.py中导入模型类,对数据进行增删改查。

2. 新增数据

2.1 方式一:实例化模型类

from django.shortcuts import render
# 导入模型
from book.models import BookInfo


# Create your views here.
# 方法一
# 实例化模型类型对象,并且在实例化的时候为属性赋值
# 此种方法会返回对应的新数据对象
book = BookInfo(
    name='python',
    pub_date='2000-01-01'
    # 其他属性有默认值,这边就不进行赋值了
)
# 方法一需要主动的调用save()方法,将新增的数据对象同步到数据库中
book.save()

在shell中测试新增数据代码


2.2 方式二:直接新增入库

对数据进行增删改查都可以调用模型类的模型管理类objects

由于没有退出shell所以不用再次导入对应的模型类

# 方法二
# 直接新增数据对象入库
# 此种方法也会把新的数据对象返回给我们
# 新增数据调用objects的create方法
BookInfo.objects.create(
    name='java',
    pub_date='2010-01-01'
)


3. 修改(更新)数据

3.1 方法一:直接修改实例属性

# 方法一
# 直接修改实例属性,修改完成后,
# 需要对修改后的实例属性进行入库同步数据库
# 1. 先查询(获取)出需要进行修改的数据对象
#    对数据进行增删改查都可以调用模型类的模型管理类objects
#    查询数据调用objects的get方法
#    获取id=1的数据对象
book = BookInfo.objects.get(id=1)
# 2. 修改获取到的实例对象的实例属性
book.read_count = 2000
# 3. 调用save()方法同步数据库
book.save()


3.2 方法二:直接修改数据

# 方法二
# 先过滤出需要进行修改的数据对象,
# 然后直接修改数据
# 此方法会返回受影响的行数
# filter过滤
BookInfo.objects.filter(id=1).update(
    read_count = 100,
    comment_count = 2000
)


如果直接调用objects的update方法,不能过滤出指定的数据对象,使用该方法相当于对所有的数据对象进行修改。

python查看数据的长度_python_04


python查看数据的长度_django_05

4. 删除数据

4.1 方法一:先查询出指定数据再进行删除

# 方法一
# 1. 先查询出要删除的数据对象
book = BookInfo.objects.get(id=5)
# 2. 删除查询出来的数据对象
book.delete()
会有一定数据的返回

python查看数据的长度_python_06


python查看数据的长度_python查看数据的长度_07

4.2 方法二:先过滤出指定数据再进行删除

# 方法二
# 先过滤出指定数据再进行删除
BookInfo.objects.filter(id=6).delete()


5. 查询数据

5.1 基本查询

5.1.1 get()

get()得到一个指定的数据对象。

book = BookInfo.objects.get(id=1)


查询不存在的数据会报异常

python查看数据的长度_服务器_08


get()只能用于查询结构为一个的查询


python查看数据的长度_python查看数据的长度_09


python查看数据的长度_数据库_10

5.1.2 all()

all()得到模型的所有数据对象。返回结果是一个列表。

books = BookInfo.objects.all()


5.1.3 count()

count()返回查询结果的数量。

books_cnt = BookInfo.objects.all().count()


# BookInfo.objects.count()也可以统计所有数据对象的个数
books_cnt = BookInfo.objects.count()


5.2 过滤查询 filter() & get() & exclude()

相当于SQL中的where语句select * from bookinfo where 条件语句

  • filter():筛选过滤符合条件的n个结果(n的取值为0-n)。返回结果为一个列表
  • get():筛选符合条件的1个结果(返回结果只能一个,大于等于一个会报错),返回一个单一对象
  • exclude():排除掉符合条件剩下的结果,相当于条件语句中not

语法:

以filter()为例

filter(字段名__运算符=值)

字段名和运算符间使用两个下划线进行分割,所以属性名不能包括多个下划线。

5.2.1 运算符

  • 相等
  • exact:表示判等。
  • 模糊查询
  • contains:是否包含。
  • 说明:如果要包含%无需转义,直接写即可。
  • startswith、endswith:以指定值开头或结尾。
  • 以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
  • 空查询
  • isnull:是否为null。
  • 范围查询
  • in:是否包含在范围内。
  • 比较查询
  • gt大于 (greater then)
  • gte大于等于 (greater then equal)
  • lt小于 (less then)
  • lte小于等于 (less then equal)
  • 不等于的运算符,使用exclude()过滤器。
  • 日期查询
  • year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

5.2.2 相等

  • 相等
  • exact:表示判等。
# 查询编号为1的图书
# exact相当于 等于号
book = BookInfo.objects.get(id__exact=1)
# 简写形式
book = BookInfo.objects.get(id=1)


# exact相当于 等于号
book = BookInfo.objects.filter(id__exact=1)
# 简写形式
book = BookInfo.objects.filter(id=1)
返回结果为一个列表

python查看数据的长度_python查看数据的长度_11

5.2.3 模糊查询

  • 模糊查询
  • contains:是否包含。
  • 说明:如果要包含%无需转义,直接写即可。
  • startswith、endswith:以指定值开头或结尾。
  • 以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
# 查询书名包含'湖'的图书
# 不知道返回结果有几个,使用filter
# 包含 运算符 contains
# 如果要包含%无需转义,直接写即可
books = BookInfo.objects.filter(name__contains='湖')


# 查询书名以'部'结尾的图书
# 不知道返回结果有几个,使用filter
# startswith、endswith:以指定值开头或结尾。
books = BookInfo.objects.filter(name__endswith='部')


5.2.4 空查询

  • 空查询
  • isnull:是否为null。
# 查询书名为空的图书
books = BookInfo.objects.filter(name__isnull=True)


5.2.5 范围查询

  • 范围查询
  • in:是否包含在范围内。
# 查询编号为1或3或5的图书
books = BookInfo.objects.filter(id__in=[1, 3, 5])


5.2.6 比较查询

  • 比较查询
  • gt大于 (greater then)
  • gte大于等于 (greater then equal)
  • lt小于 (less then)
  • lte小于等于 (less then equal)
  • 不等于的运算符,使用exclude()过滤器。
# 查询编号大于3的图书
books = BookInfo.objects.filter(id__gt=3)


# 查询编号不大于3的图书
books = BookInfo.objects.exclude(id__gt=3)


5.2.7 日期查询

  • 日期查询
  • year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
# 查询1980年发表的图书
books = BookInfo.objects.filter(pub_date__year='1980')


# 查询1990年1月1日后发表的图书
books = BookInfo.objects.filter(pub_date__gt='1990-1-1')


注意: 日期的格式只能YYYY-MM-DD

python查看数据的长度_数据库_12


python查看数据的长度_python_13

5.3 F对象(两个属性进行比较)

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

语法:

以filter为例

filter(字段名__运算符=F('字段名'))
from django.db.models import F


# 查询阅读量大于等于评论量的图书。
books = BookInfo.objects.filter(read_count__gt=F('comment_count'))


# 查询阅读量大于2倍评论量的图书。
books = BookInfo.objects.filter(read_count__gt=F('comment_count') * 2)


5.4 Q对象(逻辑或与非查询)

需要实现逻辑或or、逻辑与and、逻辑非not的查询,可以使用Q()对象结合|&~运算符,Q对象被义在django.db.models中。

语法:

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

5.4.1 逻辑与查询

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

from django.db.models import Q


# 查询阅读量大于20,并且编号小于3的图书。
# 方法一: 进行多次过滤得到结果
books = BookInfo.objects.filter(read_count__gt=20).filter(id__lt=3)
# 方法二:
books = BookInfo.objects.filter(read_count__gt=20, id__lt=3)
# 方法三:使用Q对象相与
books = BookInfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))


5.4.2 逻辑或查询

逻辑或查询只能使用Q对象实现

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

# 查询阅读量大于20,或编号小于3的图书
books = BookInfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))


5.4.3 逻辑非查询

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

# 查询编号不等于3的图书。
books = BookInfo.objects.exclude(id=3)

books = BookInfo.objects.filter(~Q(id=3))


5.5 聚合函数

使用aggregate()过滤器调用聚合函数。

聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和,被定义在django.db.models中。

语法:

aggregate(聚合函数('字段名'))

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

{'属性名__聚合类小写':值}
# 导入聚合函数
from django.db.models import Avg, Count, Max, Min, Sum

# 查询图书的总阅读量。
books = BookInfo.objects.aggregate(Sum('read_count'))


5.6 排序

使用order_by()对结果进行排序.

降序排序只需要在指定字段前加一个负号即可

# 根据评论数对所有图书的查询结果进行排序
# 默认升序
books = BookInfo.objects.all().order_by('comment_count')
# 降序
books = BookInfo.objects.all().order_by('-comment_count')


# 根据阅读数和id对所有图书的查询结果进行排序
# 阅读数升序,相同时按照id号升序排序
books = BookInfo.objects.all().order_by('read_count', 'id')
# 阅读数升序,相同时按照id号降序排序
books = BookInfo.objects.all().order_by('read_count', '-id')



5.7 关联查询

5.7.1 由一到多的访问

已知主表数据,关联查询从表数据。

语法:

使用系统内部自动生成的关联模型,关联模型类型小写_set Django会自动生成添加。

主表模型(实例对象).关联模型类型小写_set
# 查询书籍为1的所有人物信息
# 1. 查询id为1的书籍
book = BookInfo.objects.get(id=1)
# 2. 根据书籍关联任务信息
people = book.peopleinfo_set.all()


5.7.2 由多到一的访问

已知从表数据,关联查询主表数据。

语法:

从表模型(实例对象).从表模型中的外键属性
from book.models import PeopleInfo


# 查询人物为1的书籍信息
# 1. 查询id为1的人物信息
person = PeopleInfo.objects.get(id=1)
# 2. 根据人物信息获取人物对应的书籍信息
book = person.book


5.7.3 关联查询的筛选

系统内部自动生成的关联模型,Django会自动生成添加从表模型作为主表模型类的属性。

# 查询图书,要求图书任务为“郭靖”
# 需要查询的为书籍信息,已知条件为人物信息
# 需要查询的为主表信息,已知条件为从表信息
# 语法:
# filter(关联从表模型类名小写__字段名__运算符=值)
book = BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
# 简写
book = BookInfo.objects.filter(peopleinfo__name='郭靖')


# 查询图书,要求图书中人物的描述包含"八"
book = BookInfo.objects.filter(peopleinfo__description__contains='


从表模型中有一个外键属性

# 需要查询的为人物信息,已知条件为书籍信息
# 需要查询的为从表信息,已知条件为主表信息
# 语法:
# filter(外键__字段名__运算符=值)
# 查询书名为“天龙八部”的所有人物
people = PeopleInfo.objects.filter(book__name__exact='天龙八部')
# 简写
people = PeopleInfo.objects.filter(book__name='天龙八部')
# 查询图书阅读量大于30的所有人物
people = PeopleInfo.objects.filter(book__read_count__gt=30)


5.8 查询集QuerySet

查询集,也称查询结果集(QuerySet),表示从数据库中获取的对象集合。

当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据。
  • order_by():对结果进行排序。

5.8.1 查询集的特性

  1. 惰性执行
  • 创建查询集不会访问数据库,直到调用查询的数据时,才会访问数据库查询数据。
  1. 缓存
  • 使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
  • 如果两个查询集无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。
  • 经过存储后,可以重用查询集,第二次使用缓存中的数据,减少了数据库的查询次数。

5.8.2 限制查询结果集

查询结果集可以看成一个列表,可以对查询集进行下标取值或切片操作。等同于sql中的limit和offset子句。

注意:不支持负数索引。

python查看数据的长度_服务器_14


python查看数据的长度_数据库_15

5.8.3 分页

导入分页模块:

from django.core.paginator import Paginator
from django.core.paginator import Paginator


# 查询结果集
books = BookInfo.objects.all()

# 对查询结果集进行分类
# 需要两个参数
# object_list:需要进行分页的结果集/列表
# per_page:每页多少条记录
# 对books进行分页,每页两条记录
p = Paginator(books, 2)
# 获取第一页的数据
# 返回结果看成列表
# object_list获取分页后的结果集
books_page = p.page(1).object_list

python查看数据的长度_django_16


获取每页对应的数据集,得到的为一个Page对象,object_list获取数据集


python查看数据的长度_django_17