django orm增删改查 基本查询 过滤查询 FQ 排序

上一篇配置数据库,生成迁移文件

什么是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')

下一篇模板的创建与使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值