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

Posted 爱学习de测试小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11-Django-基础篇-数据库操作相关的知识,希望对你有一定的参考价值。

数据库操作


前言

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

增加数据

1. save

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

2. create

  • 通过模型类.objects.create()保存
from book.models import PeopleInfo
PeopleInfo.objects.create(
      name='小白',
      book=book
    )
  • 在shell命令行中执行如下:
  • 查看数据库

删除数据

1. 模型类对象delete

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

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

BookInfo.objects.filter(name='测试小白帝都漂流记').delete()
  • shell工具中执行
  • 查看数据库中是否被删除

修改数据

1. save

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

2. update

  • 使用模型类.objects.filter().update(),会返回受影响的行数
BookInfo.objects.filter(name='测试小白帝都漂流记').update(commentcount=88)
  • 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()
  • 过滤查询
"""
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日后发表的图书

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

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'))
  • 排序函数
# 排序
# 默认升序
BookInfo.objects.all().order_by('readcount')
# - 表示降续
BookInfo.objects.all().order_by('-readcount')

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
  • 关联过滤查询
# 关联过滤查询
"""
一本书对应多个人物,
由多模型类(人物)条件,查询一模型类(图书)数据
模型类名.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)

5. 查询集QuerySet

概念
  • 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
  • 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据。
  • order_by():对结果进行排序。
两大特性
  • 惰性执行
books = BookInfo.objects.all()
for book in books:
    print(book.name)
  • 缓存
# [book.id for book in BookInfo.objects.all()] 每执行一次查询一次数据库
books = BookInfo.objects.all()
[book.id for book in books]  # 经过存储后,可以重用查询集,第二次使用缓存中的数据
限制查询集
BookInfo.objects.all()[0:2]
分页
# 分页
# 查询数据
books = BookInfo.objects.all()
# 导入分页类
from django.core.paginator import Paginator

# 创建分页实例
paginator = Paginator(books, 2)
# 获取指定页码的数据
page_books = paginator.page(1)
# 获取分页数据
total_page = paginator.num_pages

以上是关于11-Django-基础篇-数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

11:Django基础之auth模块

MongoDb索引--基础篇

数据库基础操作

身价过亿的帝都富豪对小码农说预处理学的不错

身家过亿的帝都太子妃参加1024盛典,小码农弟弟为他献上定时器一篇

11.Django基础九之中间件