• [Python]Django 数据库数据的增删改查


    在这里插入图片描述


    前言

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



    1. shell

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

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

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

    python manage.py shell
    
    • 1

    在这里插入图片描述

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

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

    在这里插入图片描述

    有关模型类的代码写在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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在shell中测试新增数据代码

    在这里插入图片描述
    在这里插入图片描述

    2.2 方式二:直接新增入库

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

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

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

    在这里插入图片描述
    在这里插入图片描述

    3. 修改(更新)数据

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

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

    在这里插入图片描述
    在这里插入图片描述

    3.2 方法二:直接修改数据

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

    在这里插入图片描述
    在这里插入图片描述

    如果直接调用objects的update方法,不能过滤出指定的数据对象,使用该方法相当于对所有的数据对象进行修改。
    在这里插入图片描述
    在这里插入图片描述

    4. 删除数据

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

    # 方法一
    # 1. 先查询出要删除的数据对象
    book = BookInfo.objects.get(id=5)
    # 2. 删除查询出来的数据对象
    book.delete()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    会有一定数据的返回
    在这里插入图片描述
    在这里插入图片描述

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

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

    在这里插入图片描述
    在这里插入图片描述

    5. 查询数据

    5.1 基本查询

    5.1.1 get()

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

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

    在这里插入图片描述

    查询不存在的数据会报异常
    在这里插入图片描述
    get()只能用于查询结构为一个的查询
    在这里插入图片描述
    在这里插入图片描述

    5.1.2 all()

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

    books = BookInfo.objects.all()
    
    • 1

    在这里插入图片描述

    5.1.3 count()

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

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

    在这里插入图片描述

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

    在这里插入图片描述

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

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

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

    语法:

    以filter()为例

    filter(字段名__运算符=)
    
    • 1

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    # exact相当于 等于号
    book = BookInfo.objects.filter(id__exact=1)
    # 简写形式
    book = BookInfo.objects.filter(id=1)
    
    • 1
    • 2
    • 3
    • 4

    返回结果为一个列表
    在这里插入图片描述

    5.2.3 模糊查询

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

    在这里插入图片描述

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

    在这里插入图片描述

    5.2.4 空查询

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

    在这里插入图片描述

    5.2.5 范围查询

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

    在这里插入图片描述

    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)
    
    • 1
    • 2

    在这里插入图片描述

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

    在这里插入图片描述

    5.2.7 日期查询

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

    在这里插入图片描述

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

    这里是引用

    注意:
    日期的格式只能YYYY-MM-DD
    在这里插入图片描述
    在这里插入图片描述

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

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

    语法:

    以filter为例

    filter(字段名__运算符=F('字段名'))
    
    • 1
    from django.db.models import F
    
    
    # 查询阅读量大于等于评论量的图书。
    books = BookInfo.objects.filter(read_count__gt=F('comment_count'))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

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

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

    语法:

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

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    5.4.2 逻辑或查询

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

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

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

    在这里插入图片描述

    5.4.3 逻辑非查询

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

    # 查询编号不等于3的图书。
    books = BookInfo.objects.exclude(id=3)
    
    books = BookInfo.objects.filter(~Q(id=3))
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    5.5 聚合函数

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

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

    语法:

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

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

    {'属性名__聚合类小写':}
    
    • 1
    # 导入聚合函数
    from django.db.models import Avg, Count, Max, Min, Sum
    
    # 查询图书的总阅读量。
    books = BookInfo.objects.aggregate(Sum('read_count'))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5.6 排序

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

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

    5.7 关联查询

    5.7.1 由一到多的访问

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

    语法:

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

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

    在这里插入图片描述
    在这里插入图片描述

    5.7.2 由多到一的访问

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

    语法:

    从表模型(实例对象).从表模型中的外键属性
    
    • 1
    from book.models import PeopleInfo
    
    
    # 查询人物为1的书籍信息
    # 1. 查询id为1的人物信息
    person = PeopleInfo.objects.get(id=1)
    # 2. 根据人物信息获取人物对应的书籍信息
    book = person.book
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    在这里插入图片描述

    5.7.3 关联查询的筛选

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

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

    在这里插入图片描述

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

    在这里插入图片描述

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

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

    在这里插入图片描述

    5.8 查询集QuerySet

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

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

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

    5.8.1 查询集的特性

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

    5.8.2 限制查询结果集

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

    注意:不支持负数索引。

    在这里插入图片描述
    在这里插入图片描述

    5.8.3 分页

    导入分页模块:

    from django.core.paginator import Paginator
    
    • 1
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    获取每页对应的数据集,得到的为一个Page对象,object_list获取数据集
    在这里插入图片描述

  • 相关阅读:
    Python爬虫实战第三例【三】【上】
    $().serializeJson()获取不到type=“checkbox“的name
    C++/Qt音视频通话开发MetaRTC源码解读,音频推流和拉流
    自动驾驶的规划控制简介
    PHP将PDF转成多个PNG文件
    DRM系列(12)之vblank_pageflip_buffer切换流程总结
    Jmeter接口测试,关联接口实现步骤(token)
    SE38 程序/事务码修改日志报表
    Win10系统修改用户名以及C盘下Users用户名实操手册(实测有效)
    猿创征文|C#基础——DBHelper
  • 原文地址:https://blog.csdn.net/m0_53022813/article/details/127131160