django---07---数据库增删改查
一: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: 射雕英雄传>
还没有评论,来说两句吧...