• 11-Django-基础篇-数据库操作



    前言

    • 本篇来学习Django中对数据库进行增、删、改、查操作,

    增加数据

    1. save

    • 通过创建模型类对象,执行对象的save()方法保存到数据库中
    from book.models import BookInfo
    book = BookInfo(
           name='测试小白漂流记',
            pub_date='2016-09-01'
         )
    book.save()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2. create

    • 通过模型类.objects.create()保存
    from book.models import PeopleInfo
    PeopleInfo.objects.create(
          name='小白',
          book=book
        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 在shell命令行中执行如下:
      在这里插入图片描述
    • 查看数据库
      在这里插入图片描述

    删除数据

    1. 模型类对象delete

    book = BookInfo.objects.get(name='测试小白魔都漂流记')
    book.delete()
    
    • 1
    • 2

    2. 模型类.objects.filter().delete()

    BookInfo.objects.filter(name='测试小白帝都漂流记').delete()
    
    • 1
    • shell工具中执行
      在这里插入图片描述
    • 查看数据库中是否被删除
      在这里插入图片描述

    修改数据

    1. save

    • 修改模型类对象的属性,然后执行save()方法
    book = BookInfo.objects.get(name='测试小白魔都漂流记')
    book.commentcount = 66
    book.save()
    
    • 1
    • 2
    • 3

    2. update

    • 使用模型类.objects.filter().update(),会返回受影响的行数
    BookInfo.objects.filter(name='测试小白帝都漂流记').update(commentcount=88)
    
    • 1
    • shell工具中执行
      在这里插入图片描述

    • 查看数据库
      在这里插入图片描述

    查询数据

    1. 基础条件查询

    • 基本查询
    from bookmanager01.models import BookInfo
    
    # get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常
    try:
        BookInfo.objects.get(id=1)
    except BookInfo.DoesNotExist as e:
        print(e)
    
    # all 查询多个结果
    BookInfo.objects.all()
    
    # count 查询结果数量
    BookInfo.objects.all().count()
    BookInfo.objects.count()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 过滤查询
    """
    fitter过滤出多个结果 返回列表
    exclude排除掉符合条件剩下的结果
    get过滤单一结果 
    模型类名.objects.filter(属性名__运算符=值)获取n个结果n=0,1,2,...
    模型类名,objects.exclude(属性名__运算符=值)获取n个结果n=0,1,2,...
    模型类名.objects.get(属性名__运算符=值)获取1个结果或者异常
    """
    # 相等 exact
    # 查询编号为1的图书
    BookInfo.objects.filter(id__exact=1)
    # 简写
    BookInfo.objects.filter(id=1)
    
    # 模糊查询
    # contains:是否包含
    BookInfo.objects.filter(name__contains='传')
    # startswith、endswith:以指定值开头或结尾
    BookInfo.objects.filter(name__endswith='部')
    
    # 空查询
    # isnull:是否为null
    BookInfo.objects.filter(name__isnull=True)
    
    #  范围查询
    # in:是否包含在范围内
    BookInfo.objects.filter(id__in=[1, 3, 5])
    
    # 比较查询
    """
    gt大于 (greater then)
    gte大于等于 (greater then equal)
    lt小于 (less then)
    lte小于等于 (less then equal)
    """
    BookInfo.objects.filter(id__gt=3)  # 查询编号大于3的图书
    
    BookInfo.objects.exclude(id__gt=3)  # 查询编号不等于3的图书
    
    # 日期查询
    # year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
    BookInfo.objects.filter(pub_date__year=1980)  # 查询1980年发表的图书
    BookInfo.objects.filter(pub_date__gt='1990-1-1')  # 查询1990年1月1日后发表的图书
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    2. F和Q对象

    • F对象
    """
    使用:2个属性的比较
    语法形式:以filter 为例模型类名。objects.filter(属性名__运算符=F('第二个属姓名'))
    """
    from django.db.models import F, Q
    
    # 查询阅读量大于等于评论量的图书。
    BookInfo.objects.filter(readcount__gt=F('commentcount'))
    # 查询阅读量大于2倍评论量的图书。
    BookInfo.objects.filter(readcount__gt=F('commentcount') * 2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • Q对象
    # 并且查询
    # 查询阅读量大于20,并且编号小于3的图书。
    BookInfo.objects.filter(readcount__gt=20, id__lt=3)
    # 或者
    BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
    
    # Q对象 可以使用&、|连接,&表示逻辑与,|表示逻辑或。
    """
    或者语法:模型类名.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值|...)
    并且语法:模型类名.objects.filter(Q(属性名__运算符=值)&Q(属性名__运算符=值)&...)
    非语法:模型类名.objects.filter(~Q(属性名__运算符=值))
    """
    # 查询阅读量大于20的图书,改写为Q对象如下
    BookInfo.objects.filter(Q(readcount__gt=20))
    # 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
    BookInfo.objects.filter(Q(readcount__gt=20) | Q(id__lt=3))
    # Q对象前可以使用~操作符,表示非not
    BookInfo.objects.exclude(id=3)
    BookInfo.objects.filter(~Q(id=3))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3. 聚合函数和排序函数

    • 聚合函数
    from django.db.models import Sum, Avg, Count, Max, Min
    
    # 聚合函数
    # 模型类名.objects.aggregate(Xxx('字段名')
    BookInfo.objects.aggregate(Sum('readcount'))
    BookInfo.objects.aggregate(Max('readcount'))
    BookInfo.objects.aggregate(Min('readcount'))
    BookInfo.objects.aggregate(Count('readcount'))
    BookInfo.objects.aggregate(Avg('readcount'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 排序函数
    # 排序
    # 默认升序
    BookInfo.objects.all().order_by('readcount')
    # - 表示降续
    BookInfo.objects.all().order_by('-readcount')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4. 级联查询

    • 关联查询
    # 级联查询
    # 查询书籍为1的所有人物信息
    book = BookInfo.objects.get(id=1)
    book.peopleinfo_set.all()  # # 一对应的模型类对象.多对应的模型类名小写_set
    
    #  查询人物为1的书籍信息
    person = PeopleInfo.objects.get(id=1)
    person.book.name  # 多对应的模型类对象.多对应的模型类中的关系类属性名
    person.book_id  # 多对应的模型类对象.关联类属性_id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 关联过滤查询
    # 关联过滤查询
    """
    一本书对应多个人物,
    由多模型类(人物)条件,查询一模型类(图书)数据
    模型类名.objects.(关联模型类名小写__字段名__运算符=值)
    """
    # 查询图书,要求图书人物为"郭靖"
    BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
    BookInfo.objects.filter(peopleinfo__name='郭靖')  # 等于可省略  运算符 __exact
    # 查询图书,要求图书中人物的描述包含"八"
    BookInfo.objects.filter(peopleinfo__description__contains='八')
    
    # 由一模型类条件查询多模型类数据: 一模型类关联属性名__一模型类属性名__条件运算符=值
    # 查询书名为“天龙八部”的所有人物
    PeopleInfo.objects.filter(book__name='天龙八部')
    # 查询图书阅读量大于30的所有人物
    PeopleInfo.objects.filter(book__readcount__gt=30)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5. 查询集QuerySet

    概念
    • 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
    • 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
    • all():返回所有数据。
    • filter():返回满足条件的数据。
    • exclude():返回满足条件之外的数据。
    • order_by():对结果进行排序。
    两大特性
    • 惰性执行
    books = BookInfo.objects.all()
    for book in books:
        print(book.name)
    
    • 1
    • 2
    • 3
    • 缓存
    # [book.id for book in BookInfo.objects.all()] 每执行一次查询一次数据库
    books = BookInfo.objects.all()
    [book.id for book in books]  # 经过存储后,可以重用查询集,第二次使用缓存中的数据
    
    • 1
    • 2
    • 3
    限制查询集
    BookInfo.objects.all()[0:2]
    
    • 1
    分页
    # 分页
    # 查询数据
    books = BookInfo.objects.all()
    # 导入分页类
    from django.core.paginator import Paginator
    
    # 创建分页实例
    paginator = Paginator(books, 2)
    # 获取指定页码的数据
    page_books = paginator.page(1)
    # 获取分页数据
    total_page = paginator.num_pages
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    matlab使用hampel滤波,去除异常值
    什么是设计模式?总结
    科比,老大1000天
    mysql 事务 Repeatable Read
    二蛋赠书一期:《快捷学习Spring》
    深入理解RBAC
    CSS3-flex布局 | 弹性盒模型
    【数据链路层】封装成帧和透明传输和差错控制
    day1 计算机硬件基础
    故障治理:如何进行故障复盘
  • 原文地址:https://blog.csdn.net/IT_heima/article/details/125963744