django---07---数据库增删改查

淡淡的烟草味﹌ 2022-12-02 00:52 261阅读 0赞

一:shell工具的使用:
1:进入shell的命令:

  1. python manage.py shell

2:导入两个模型类:

  1. from bookinfo.models import BookInfo , HeroInfo

二:数据库增加数据:
方法一:使用模型类对象
注意:在没有执行save方法之前,都没有访问数据库。

  1. (python_django) ubuntu@python:~/demo$ python manage.py shell
  2. Python 3.6.9 (default, Jul 17 2020, 12:50:27)
  3. [GCC 8.4.0] on linux
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. (InteractiveConsole)
  6. >>> from booktest.models import BookInfo , HeroInfo
  7. >>> book = BookInfo()
  8. >>> book.btitle = "山海经"
  9. >>> book.bpub_date = '1998-10-09'
  10. >>> book.bread = 23
  11. >>> book.bcomment = 10
  12. >>> book.save()

方法二:使用模型类增加数据:

  1. >>> BookInfo.objects.create(btitle = '淮南子',bpub_date = '1997-08-23', bread = 40 , bcomment = 32 )
  2. <BookInfo: 淮南子>

三:修改数据库数据:
方法一:使用模型类对象:

  1. >>> book.btitle = "淮南子之善文爷爷"
  2. >>> book.save()

方法二:使用模型类中的filter()下的update()方法:

  1. >>> BookInfo.objects.filter(btitle="美猴王").update(btitle="西游记")
  2. 1

四:删除数据库数据:
方法一:使用模型类对象:

  1. >>> book.delete()
  2. (1, {
  3. 'booktest.HeroInfo': 0, 'booktest.BookInfo': 1})

方法二:使用模型类的filter()下的delete()方法

  1. >>> BookInfo.objects.filter(btitle = "淮南子").delete()
  2. (1, {
  3. 'booktest.HeroInfo': 0, 'booktest.BookInfo': 1})

五:查询数据库—最基本的方法

  1. get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
  2. all 查询多个结果。
  3. count 查询结果数量

5.1:查询数据库中所有信息:

  1. >>> BookInfo.objects.all()
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

5.2:查询数据库表中id是1的数据:

  1. >>> BookInfo.objects.get(id=1)
  2. <BookInfo: 射雕英雄传>

5.3:查询数据库表中的结果的数量

  1. >>> BookInfo.objects.count()
  2. 6

六:过滤查询:
filter 过滤出满足条件的多个结果
exclude 排除掉符合条件剩下的结果

格式:
属性名称__比较运算符=值
属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线

6.1:相等exact美[ɪɡˈzækt]
例:查询编号为1的图书。

  1. >>> BookInfo.objects.filter(id__exact = 1)
  2. <QuerySet [<BookInfo: 射雕英雄传>]>
  3. >>> BookInfo.objects.filter(id = 1)
  4. <QuerySet [<BookInfo: 射雕英雄传>]>

6.2模糊查询:contains:是否包含。
如果要包含%无需转义,直接写即可
例:查询书名包含’传’的图书。

  1. >>> BookInfo.objects.filter(btitle__contains = "义")
  2. <QuerySet [<BookInfo: 三国演义>]>

6.3:startswith、endswith:以指定值开头或结尾。

  1. >>> BookInfo.objects.filter(btitle__endswith = '记')
  2. <QuerySet [<BookInfo: 西游记>]>
  3. >>> BookInfo.objects.filter(btitle__startswith = '射')
  4. <QuerySet [<BookInfo: 射雕英雄传>]>

注意:以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写
iexact、icontains、istartswith、iendswith.
6.4:空查询:
例:查询书名不为空的图书:
注意:false的F大写。

  1. >>> BookInfo.objects.filter(btitle__isnull = False)
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

6.5:范围查询:

  1. >>> BookInfo.objects.filter(id__in = [1, 3, 5])
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>, <BookInfo: 西游记>]>

6.6:比较查询:
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)

案例一:查询编号大于3的:

  1. >>> BookInfo.objects.filter(id__gt = 3)
  2. <QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

案例二:查询编号大于等于3的:

  1. >>> BookInfo.objects.filter(id__gte = 3)
  2. <QuerySet [<BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

案例三:查询编号小于等于3的:

  1. >>> BookInfo.objects.filter(id__lte = 3)
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>]>

案例四:查询编号小于3的:

  1. >>> BookInfo.objects.filter(id__lt = 3)
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>]>

6.7:不等于运算符:使用**exclude()**过滤器
查询编号不等于3的图书:

  1. >>> BookInfo.objects.exclude(id = 3)
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

6.8:日期查询:
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。

  1. >>> BookInfo.objects.filter(bpub_date__year = 1980)
  2. <QuerySet [<BookInfo: 射雕英雄传>]>

例:查询1980年1月1日后发表的图书
注意:使用date需要提前先导入date包。导入shell

  1. >>> from django.utils.datetime_safe import date
  2. >>> BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
  3. <QuerySet [<BookInfo: 笑傲江湖>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

七:F对象:对象的属性和属性之间比较:
例:查询阅读量大于等于评论量的图书。
注意:先要导入F包:from django.db.models import F

  1. >>> BookInfo.objects.filter(bread__gt = F('bcomment'))
  2. <QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 西游记>]>

例:查询阅读量大于2倍评论量的图书。

  1. >>> BookInfo.objects.filter(bread__gt = F('bcomment')* 2)
  2. <QuerySet [<BookInfo: 雪山飞狐>]>

八:Q对象:过滤器之间的逻辑关系:
情况一:and
例:查询阅读量大于20,并且编号小于3的图书。

  1. >>> BookInfo.objects.filter(bread__gt = 20 , id__lt = 3)
  2. <QuerySet [<BookInfo: 天龙八部>]>
  3. >>> BookInfo.objects.filter(bread__gt = 20).filter(id__lt = 3)
  4. <QuerySet [<BookInfo: 天龙八部>]>

情况二:or
例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现。

  1. >>> from django.db.models import Q
  2. >>> BookInfo.objects.filter(Q(bread__gt = 20) | Q(id__lt = 3))
  3. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

情况三:非
例:查询编号不等于3的图书。

  1. >>> BookInfo.objects.filter(~Q(id = 3))
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>

八:聚合函数:
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
例:查询图书的总阅读量。
注意:先导入包from django.db.models import Sum
并且aggregate返回的是字典类型的数据

  1. >>> from django.db.models import Sum
  2. >>> BookInfo.objects.aggregate(Sum('bread'))
  3. {
  4. 'bread__sum': 186}

特别:count不适用aggregate
例:查询图书总数。

  1. >>> BookInfo.objects.count()
  2. 6

九:排序:
案例:根据阅读量升序/降序:

  1. >>> BookInfo.objects.all().order_by('bread')
  2. <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>, <BookInfo: 西游记>, <BookInfo: 三国演义>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>
  3. >>> BookInfo.objects.all().order_by('-bread')
  4. <QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 天龙八部>, <BookInfo: 西游记>, <BookInfo: 三国演义>, <BookInfo: 笑傲江湖>, <BookInfo: 射雕英雄传>]>

十:关联查询:
类型一:一对多的访问语法:

  1. 一对应模型类对象.多对应模型类的小写_set

案例:查询射雕英雄传书里面的的人物的详细信息:

  1. >>> b = BookInfo.objects.get(id=1)
  2. >>> b.heroinfo_set.all()
  3. <QuerySet [<HeroInfo: 郭靖>, <HeroInfo: 黄蓉>, <HeroInfo: 黄药师>, <HeroInfo: 欧阳锋>, <HeroInfo: 梅超风>]>

类型二:由多到一的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名(外键名)
案例:查询郭靖所在图书的详细信息:

  1. >>> hero = HeroInfo.objects.get(id=1)
  2. >>> hero.hbook
  3. <BookInfo: 射雕英雄传>

发表评论

表情:
评论列表 (有 0 条评论,261人围观)

还没有评论,来说两句吧...

相关阅读