Django(五):数据库操作(增删改查)

文章目录

    • 一、增加
    • 二、查询
      • 基本查询
      • 过滤查询
        • 1、相等
        • 2、模糊查询
        • 3、空查询,范围查询
        • 4、比较查询
        • 5、日期查询
        • 6、F对象
        • 7、Q对象
        • 8、聚合函数
        • 9、排序
        • 10、关联查询
    • 三、修改
        • 1、save
        • 2、update
    • 四、删除
        • 1、模型类对象delete
        • 2、模型类.objects.filter().delete()
    • 五、查询集QuerySet
        • 1、返回值为查询集的方法
        • 2、特性
        • 3、限制查询集

一、增加

  • save()
from datetime import date
book = BookInfo()
book.btitle = '流浪地球'
book.bpub_date = date(2001,7,1)

book.save()

Django(五):数据库操作(增删改查)_第1张图片

  • create()
HeroInfo.objects.create(
    hname='txf',
    hgender=1,
    hbook_id=book.id
)

Django(五):数据库操作(增删改查)_第2张图片

二、查询

基本查询

  • get():查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
  • all 查询多个结果。
  • count 查询结果数量
BookInfo.objects.all()

 HeroInfo.objects.count()

 HeroInfo.objects.get(id=1)

 HeroInfo.objects.get(pk=1)
 
 BookInfo.objects.get(id=188)

Django(五):数据库操作(增删改查)_第3张图片

过滤查询

实现SQL中的where功能,包括

  • filter 过滤出多个结果
  • exclude 排除掉符合条件剩下的结果
  • get 过滤单一结果
    过滤条件的表达语法如下:
    属性名称__比较运算符=值

1、相等

exact:表示相等

BookInfo.objects.filter(id__exact=1)
# 可简写为:
BookInfo.objects.filter(id=1)

Django(五):数据库操作(增删改查)_第4张图片

2、模糊查询

contains:包含
startswith:以什么开头
endswith:以什么结尾

HeroInfo.objects.filter(hcomment__contains='掌')

HeroInfo.objects.filter(hname__contains='黄')

Django(五):数据库操作(增删改查)_第5张图片

3、空查询,范围查询

isnull:空查询
in:范围查询

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

4、比较查询

  • gt 大于 (greater then)
  • gte 大于等于 (greater then equal)
  • lt 小于 (less then)
  • lte 小于等于 (less then equal)
  • 不等于可以使用不满足条件 exclude() 过滤器
 BookInfo.objects.filter(id__gt=2)
 # 查询id 不为 1,3,5 的图书信息
 BookInfo.objects.exclude(id__in=[1,3,5])

5、日期查询

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

# 查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
#查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

6、F对象

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

from django.db.models import F
# 查询阅读量大于等于评论量的图书。
BookInfo.objects.filter(bread__gte=F('bcomment'))
# 可以在F对象上使用算数运算。查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)

7、Q对象

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

  • &:与,相当pyhton中的and,flask查询中的and_
  • |:或,相当pyhton中的or,flask查询中的or_
  • ~:非,相当pyhton中的not,flask查询中的not_
# 查询阅读量大于20,并且编号小于3的图书。

BookInfo.objects.filter(bread__gt=20,id__lt=3)
# 也可以使用连续查询,因为BookInfo.objects.filter(bread__gt=20)的结果是QuerySet 对象,
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
# 改成Q查询
BookInfo.objects.filter(Q(bread__gt=20)&Q(id__lt=3))
# 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
# 查询编号不等于3的图书。
BookInfo.objects.filter(~Q(pk=3))

8、聚合函数

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


from django.db.models import Sum
# 查询图书的总阅读量。
BookInfo.objects.aggregate(Sum('bread'))

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

{‘属性名__聚合类小写’:值}

9、排序

order_by

# 使用order_by对结果进行排序
BookInfo.objects.all().order_by('bread')  # 升序
# 降序给排序字段名前加负号 ‘-’
BookInfo.objects.all().order_by('-bread')  # 降序

10、关联查询

1)、直接查询
Django(五):数据库操作(增删改查)_第6张图片

  • 一到多:一对应的模型类对象.多对应的模型类名小写_set
   book = BookInfo.objects.get(id=3)
   print(book)
   # 一对应的模型类对象.多对应的模型类名小写_set 
   heros = book.heroinfo_set.all()
   print(heros)

Django(五):数据库操作(增删改查)_第7张图片

  • 多到一:多对应的模型类对象.多对应的模型类中的关系类属性名
   hero = HeroInfo.objects.get(id=1)
   print(hero)
   # 多对应的模型类对象.多对应的模型类中的关系类属性名
   book = hero.hbook
   print(book)

Django(五):数据库操作(增删改查)_第8张图片

  • 访问一对应的模型类关联对象的id语法:多对应的模型类对象.关联类属性_id
   h = HeroInfo.objects.get(id=1)
   h.hbook_id

2)、过滤查询

  • 由多模型类条件查询一模型类数据
一类名.objects.filter(多类名小写__多类属性名__条件名)

# 查询英雄名包含‘不’的图书
BookInfo.objects.filter(heroinfo__hname__contains='不')
# , ]>
  • 由一模型类条件查询多模型类数据
多类名.objects.filter(关联属性__一类属性名__条件名)
# 查询书名为‘雪山飞狐’的所有英雄
HeroInfo.objects.filter(hbook__btitle='雪山飞狐')
#, , , ]>

注意:

①通过模型类实现关联查询时,要查询哪个表中的的数据时,就需要通过哪个表查询

②写关联查询条件时,若果类中没有关系属性,条件需要写对应类的名,如果类中有关系性属性,直接使用关系属性

三、修改

修改更新有两种方法

1、save

修改模型类对象的属性,然后执行save()方法

hero = HeroInfo.objects.get(hname='txf')
hero.hname = '田小芳'
hero.save()

2、update

使用模型类.objects.filter().update(),会返回受影响的行数

HeroInfo.objects.filter(hname='jjj').update(hname='django')

Django(五):数据库操作(增删改查)_第9张图片

四、删除

删除有两种方法

1、模型类对象delete

hero = HeroInfo.objects.get(id=13)
hero.delete()

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

HeroInfo.objects.filter(id=14).delete()

五、查询集QuerySet

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

1、返回值为查询集的方法

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

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

说明:

对一个返回值为查询集的实例,可以继续使用我们前面学的查询函数

2、特性

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

3、限制查询集

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

获取第12项,运行查看。
qs = BookInfo.objects.all()[0:2]

你可能感兴趣的:(python,Django,Django,数据库操作)