当前位置: 首页 > 工具软件 > django-less > 使用案例 >

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

冉锋
2023-12-01

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

python manage.py shell

2:导入两个模型类:

from bookinfo.models import BookInfo , HeroInfo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>> BookInfo.objects.count()
6

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

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

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

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

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

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

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

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

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

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

6.5:范围查询:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>> BookInfo.objects.count()
6

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

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

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

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

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

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

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

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

 类似资料: