上一篇配置数据库,生成迁移文件
什么是ORM?
ORM 中的 "O"指的是object ; R指的是relations关系;M指的是mapping(映射).所以ORM是 对象-关系-映射 的简称.
主要作用 :
ORM主要的作用是实现数据模型和数据库的解耦, 就是数据模型的设置不再需要依赖特定的数据库;
定义一个类自动生成数据库的表结构;
orm 增删改查
打开pycharm左下角的python Console
导包 上一篇定义好了两个模型类
添加(第一种方式)
>>> from booktest.models import HeroInfo,BookInfo
>>> book = BookInfo()
>>> book.btitle = '三国演义'
>>> book.bpub_date = '1986-01-12'
>>> book.bread=100
>>> book.bcomment=200
>>> book.save()
输入book,可以看到打印出书名’三国演义’了
save()保存之后 ,可以跳转到mysql里去看看bookinfo表,已经添加成功了.
添加的第二种方式
book2 = BookInfo.objects.create(btitle='水浒传',bpub_date='1969-2-23',bread=200,bcomment=150)
这句命令执行完立即生效了,可以去sql数据库查看效果
添加完书,再把人物也添加上(注意外键)
herozhu = HeroInfo.objects.create(
hname = "猪八戒",
hgender = 0,
hdesc = 'houhouhou',
hbook = book
)
herosha = HeroInfo.objects.create(
hname = "沙悟净",
hgender = 1,
hdesc = '呵呵',
hbook = book
)
两个人物成功添加到’三国演义’那本书里了(虽然有点驴唇不对马嘴)
orm 修改数据
第一种修改方式
>>> hz = HeroInfo.objects.get(hname='猪八戒')
>>> hz
<HeroInfo: 猪八戒>
>>> hz.hname='猪猪侠'
>>> hz.save()
>>> hz
<HeroInfo: 猪猪侠>
直接动态添加的方式,记得保存之后才生效 !
第二种修改方法
>>> HeroInfo.objects.filter(hname='沙悟净').update(hname='沙包')
1
删除
也是两种,都是用对象.delete();
只是一种是get选中 , 另一种是 filter过滤选中
hzhu = HeroInfo.objects.get(id = 18)
hzhu.delete()
sha_li = HeroInfo.objects.filter(id = 19)
sha_li.delete()
查
基本查询
get 查询单一结果,不存在会报异常,如果存在多个结果也会爆异常
all 查询多个结果
count 查询结果数量
过滤查询
# 查询id为2的图书
BookInfo.objects.filter(id__exact=2) # 精确等于
BookInfo.objects.filter(id=2)
BookInfo.objects.get(id=2)
#查询书名包含'湖'的图书
BookInfo.objects.filter(btitle__contains='湖')#包含
#查询书名以'部'结尾的图书
BookInfo.objects.filter(btitle__endswith='部')# 以....结尾
#查询书名不为空的图书
BookInfo.objects.filter(btitle__isnull=False)# __isnull = True/False
#查询编号为1或3或5的图书
BookInfo.objects.filter(id__in = [1,3,5,6]) # 存在于一个list范围内
#查询编号大于3的图书
BookInfo.objects.filter(id__gt = 3)#大于
BookInfo.objects.filter(id__lte = 3)#小于
BookInfo.objects.exclude(id__gt = 3)#大于
#查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year = 1980)#日期字段的年份
#查询1990年1月1日后发表的图书
BookInfo.objects.filter(bpub_date__gt = '1990-1-1')#大于
方法对应的解释如下:
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于 (greater than 的缩写 以下都是缩写)
__gte 大于等于 (greater than and equal)
__lt 小于 (less than)
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别
F 与 Q
F :
- 实现属性之间 的比较
- 导包
from django.db.models import F,Q
- -语法格式如下
#阅读量大于等于评论量
BookInfo.objects.filter(bread__gte = F('bcomment'))
#阅读量大于等于2倍评论量
BookInfo.objects.filter(bread__gte = F('bcomment')*2)
Q :
-
实现mysql里的not and or
-
& | ~
的使用
# 阅读量大于20 并且 编号小于3
BookInfo.objects.filter(bread__gt=20,id__lt=3)
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
BookInfo.objects.filter( Q(bread__gt=20) & Q(id__lt=3) )
#or 阅读量大于20 或者编号小于3
BookInfo.objects.filter( Q(bread__gt=20) | Q(id__lt=3) )
# not 编号不等于3的
BookInfo.objects.filter(~Q(id=3))
级联查询
1 关联查询
表与表,一对多关系 , 获取1对应的多的一方的数据
# 语法一的对象.多的模型类小写_set.all()
>>> book = BookInfo.objects.get(id=1)
>>> book
<BookInfo: 三国演绎>
>>> heros = book.heroinfo_set.all()
>>> heros
<QuerySet [<HeroInfo: 郭靖>, <HeroInfo: 黄蓉>, <HeroInfo: 黄药师>, <HeroInfo: 欧阳锋>, <HeroInfo: 梅超风>]>
获取多对一 ,一 那方的数据
# 直接使用外键
>>> h = HeroInfo.objects.get(id=1)
>>> h
<HeroInfo: 郭靖>
>>> h.hbook
<BookInfo: 三国演绎>
>>> h.hbook_id
1
2关联过滤查询
查询一 的模型, 条件是对多的一方属性进行判断
# 查询英雄是郭靖的相关书籍
# 条件如果是需要关联模型的字段 , 使用关联模型类小写__属性名__条件运算符 = 'xxx'
>>> book_g = BookInfo.objects.filter(heroinfo__hname='郭靖')
>>> book_g[0]
<BookInfo: 三国演绎>
# 查询英雄招式包含'掌'的相关书籍
>>> book_z = BookInfo.objects.filter(heroinfo__hdesc__contains='掌')
>>> book_z
<QuerySet [<BookInfo: 三国演绎>, <BookInfo: 水浒>, <BookInfo: 水浒>]>
查询多的模型,条件时对一的一方属性进行判断
# 条件使用关联的模型类的字段 一模型类外键名__一模型类属性名__条件运算符 = 值
# 查询水浒传里所有英雄
>>> ht = HeroInfo.objects.filter(hbook__btitle='水浒传')
>>> ht
<QuerySet [<HeroInfo: 令狐冲>, <HeroInfo: 任盈盈>, <HeroInfo: 岳不群>, <HeroInfo: 东方不败>]>
# 查询阅读量大于等于20的书的所有的英雄
>>> h1 =HeroInfo.objects.filter(hbook__bread__gte=20)
>>> h1
<QuerySet [<HeroInfo: 郭靖>, <HeroInfo: 黄蓉>, <HeroInfo: 黄药师>, <HeroInfo: 欧阳锋>, <HeroInfo: 梅超风>, <HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>, <HeroInfo: 令狐冲>, <HeroInfo: 任盈盈>, <HeroInfo: 岳不群>, <HeroInfo: 东方不败>, <HeroInfo: 猪猪侠>, <HeroInfo: 沙包>]>
聚合函数
- aggregate返回值是字典
- Avg Count Sum Max Min
- 导包
from django.db.models import Avg, Count, Sum, Max, Min
#查询总阅读量
BookInfo.objects.aggregate(Sum('bread'))
#查询最大的阅读量
BookInfo.objects.aggregate(Max('bread'))
# 计数
BookInfo.objects.aggregate(Count('bread'))
排序
order_by 用法如下:
BookInfo.objects.all().order_by('bread')
BookInfo.objects.filter(id__in[1,3,5]).order_by('bread')
下一篇模板的创建与使用