django的数据库操作-16
Django的manage工具提供了shell命令,已经帮助我们配置好当前工程的运行环境(如连接好数据库等),我们会在自带终端中执行测试python语句。
manage.py 所在目录执行命令
python manage.py shell
这打开了一个交互式命令行。
导入模型类
from book.models import Book
from book.models import Role
导入date包处理时间
from datetime import date
增
增加数据有两种方式
1.save
创建模型类对象,再使用 save 保存到数据库中
新增书籍 “西游记”
book = Book(
b_title="西游记",
b_pub_date=date(1988,1,1),
b_read=20,
b_comment=10,
is_delete=False)
>>> book.save()
2.create
直接保存到数据库中
“西游记”书籍新增角色 “孙悟空”
Role.objects.create(
r_name="孙悟空",
r_gender="1",
r_describe="猴哥",
r_book_id=book.id)
查
1.基本查询
get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常,返回一个模型类对象。
all 查询多个结果,返回一个查询集。
count 查询结果数量。
get
get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
查询编号为5的书籍
>>> Book.objects.get(pk=5)
<Book: Book object>
objects 是模型管理器,会在后边有具体的讲解。
pk代表primary key的缩写,也就是任何model中都有的主键,当id也是主键的时候,我们可以认为pk和id是完全一样的。但是当model的主键不是id的时候,两者就有了区别。
输出出来的 <Book: Book object> 无法看出是不是我们写进去的数据,为了让显示更人性化,我们给数据库模型添加一个 _str__ 方法。
class Book(models.Model):
...
def __str__(self):
return self.b_title
class Role(models.Model):
...
def __str__(self):
return self.r_name
重启shell,重新导入模型类
>>> Book.objects.get(id=5)
<Book: 西游记>
all
all 查询多个结果。
查询所有书
>>> Book.objects.all()
<QuerySet [<Book: 射雕英雄传>, <Book: 天龙八部>, <Book: 笑傲江湖>, <Book: 雪山飞狐>, <Book: 西游记>]>
count
count 查询结果数量。
获得书籍数量
>>> Book.objects.count()
5
2.过滤查询
过滤查询实现sql语句中的 where 功能,包括:
filter 过滤出多个结果,返回一个查询集
exclude 排除掉符合条件剩下的结果,返回一个查询集
get 过滤单一结果
过滤查询语法:
模型类名.objects.查询方式(过滤条件)
过滤条件语法:
字段名称__条件运算符=值
条件运算符:
exact:相等。
contains:包含。
startswith:指定值开头
endswith:指定值结尾
isnull:是否为null。
in:是否包含在范围内。
gt: 大于 (greater then)
gte: 大于等于 (greater then equal)
lt: 小于 (less then)
lte: 小于等于 (less then equal)
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
相等
exact:表示相等
查询书名等于“西游记”的书
>>> Book.objects.filter(b_title__exact="西游记")
<QuerySet [<Book: 西游记>]>
包含(模糊查询)
contains:包含
书名包含“八”字的书
>>> Book.objects.filter(b_title__contains="八")
<QuerySet [<Book: 天龙八部>]>
开头
书名“笑”开头的数
>>> Book.objects.filter(b_title__startswith="笑")
<QuerySet [<Book: 笑傲江湖>]>
结尾
>>> Book.objects.filter(b_title__endswith="狐")
<QuerySet [<Book: 雪山飞狐>]>
空
isnull:是否为null
书名不为空
>>> Book.objects.filter(b_title__isnull=False)
<QuerySet [<Book: 射雕英雄传>, <Book: 天龙八部>, <Book: 笑傲江湖>, <Book: 雪山飞狐>, <Book: 西游记>]>
包含(范围)
in:是否包含在范围内
编号 1,2,3的书
>>> Book.objects.filter(pk__in=[1, 2, 3])
<QuerySet [<Book: 射雕英雄传>, <Book: 天龙八部>, <Book: 笑傲江湖>]>
大于小于
gt: 大于 (greater then)
gte: 大于等于 (greater then equal)
lt: 小于 (less then)
lte: 小于等于 (less then equal)
编号大于3的书
>>> Book.objects.filter(pk__gt=3)
<QuerySet [<Book: 雪山飞狐>, <Book: 西游记>]>
时间
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
1995年的书
>>> Book.objects.filter(b_pub_date__year="1995")
<QuerySet [<Book: 笑傲江湖>]>
3. F对象
F()是代表模型字段的值,可以用来修改字段或者比较字段。
导入F对象
from django.db.models import F
F对象使用
F(字段名)
阅读量大于评论量
>>> Book.objects.filter(b_read__gt=F('b_comment'))
<QuerySet [<Book: 雪山飞狐>, <Book: 西游记>]>
阅读量大于评论量两倍
>>> Book.objects.filter(b_read__gt=F('b_comment')*2)
<QuerySet [<Book: 雪山飞狐>]>
4. Q对象
随着程序的复杂,查询条件也会越来越复杂,类似前边的查询语句也会变得越来越长。
例如查询阅读量大于20且评论数大于30的书,需要这样
>>> book = Book.objects.filter(b_read__gt=20)
>>> book.filter(b_comment__gt=30)
<QuerySet [<Book: 天龙八部>]>
或者这样
>>> Book.objects.filter(b_read__gt=20).filter(b_comment__gt=30)
<QuerySet [<Book: 天龙八部>]>
但是这样的语句是相当繁杂且不利于阅读的。
Q()对象就是为了将这些条件组合起来。
Q对象可以使用 & | ~ 连接,& 表示逻辑与, | 表示逻辑或,~ 表示非。
类似sql语句中where部分的 and or not 关键字。
导入Q对象
from django.db.models import Q
使用Q对象实现查询阅读量大于20且评论数大于30的书
>>> Book.objects.filter(Q(b_read__gt=20)&Q(b_comment__gt=30))
<QuerySet [<Book: 天龙八部>]>
5. 聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和。
需要从 django.db.models 中导入,例如
from django.db.models import Sum
查询最多阅读数
>>> Book.objects.aggregate(Max('b_read'))
{'b_read__max': 58}
聚合函数查询结果是一个字典类型
{'字段名__聚合类小写': 查询结果}
6. 排序
使用 order_by 对查询结果排序,返回一个查询集。
按阅读量排序
>>> Book.objects.all().order_by('b_read') # 升序排序
<QuerySet [<Book: 射雕英雄传>, <Book: 笑傲江湖>, <Book: 西游记>, <Book: 天龙八部>, <Book: 雪山飞狐>]>
>>> Book.objects.all().order_by('-b_read') # 降序排序
<QuerySet [<Book: 雪山飞狐>, <Book: 天龙八部>, <Book: 笑傲江湖>, <Book: 西游记>, <Book: 射雕英雄传>]>
7. 关联查询
一查多
语法
一方查询对象.多方模型类名小写__set
查询“天龙八部”所有的角色
>>> book = Book.objects.get(b_title__exact="天龙八部")
>>> book.role_set.all()
<QuerySet [<Role: 乔峰>, <Role: 段誉>, <Role: 虚竹>, <Role: 王语嫣>]>
多查一
语法
多方查询对象.多方有对应关系的字段名
查询“段誉”所在书名
>>> role = Role.objects.get(r_name__exact="段誉")
>>> role.r_book
<Book: 天龙八部>
8. 关联+过滤查询
根据多方条件查一方
语法格式
多方模型类名小写__多方字段名__条件运算符=值
查询编号为1角色所在书籍
>>> Book.objects.filter(role__id__exact=1)
<QuerySet [<Book: 射雕英雄传>]>
查询角色名字带“黄”字的书籍
>>> Book.objects.filter(role__r_name__contains="黄")
<QuerySet [<Book: 射雕英雄传>, <Book: 射雕英雄传>]>
当查询条件为等于的时候可以省略条件运算符
查询编号为1角色所在书籍可以这样写
>>> Book.objects.get(role__id=1)
<Book: 射雕英雄传>
根据一方条件查多方
语法格式
多方有对应关系的字段名__一方字段名__查询条件=值
查询“雪山飞狐所有角色”
>>> Role.objects.filter(r_book__b_title__exact="雪山飞狐")
<QuerySet [<Role: 胡斐>, <Role: 苗若兰>, <Role: 程灵素>, <Role: 袁紫衣>]>
查询阅读量大于30的书籍角色
>>> Role.objects.filter(r_book__b_read__gt=30)
<QuerySet [<Role: 乔峰>, <Role: 段誉>, <Role: 虚竹>, <Role: 王语嫣>, <Role: 胡斐>, <Role: 苗若兰>, <Role: 程灵素>, <Role: 袁紫衣>]>
当查询条件是等于的时候可以省略条件运算符
查询“雪山飞狐所有角色”可以这样写
>>> Role.objects.filter(r_book__b_title="雪山飞狐")
<QuerySet [<Role: 胡斐>, <Role: 苗若兰>, <Role: 程灵素>, <Role: 袁紫衣>]>
删
删除数据使用查询结果对象的 delete 方法
语法格式
查询结果对象.delete()
删除阅读量小于20的书
>>> Book.objects.filter(b_read__lt=20).delete()
(6, {'book.Role': 5, 'book.Book': 1})
一般删除数据只使用逻辑删除,即修改 is_delete 字段为 True
改
修改数据有两种方式
1. save
获得 单个模型类 对象,修改数据后使用save保存
>>> role = Role.objects.get(id__exact=18)
>>> role.r_name = "齐天大圣"
>>> role.save()
2. update
获得 查询集 对象,使用 update 方法修改数据,修改后会返回被影响数据条数
修改 id 大于15的角色名字为 “不知名人士”
>>> Role.objects.filter(id__gt=15).update(r_name="不知名人士")
4
django的数据库操作-16的更多相关文章
- Django 2.0 学习(16):Django ORM 数据库操作(下)
Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...
- django models 数据库操作
django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...
- Django 2.0 学习(14):Django ORM 数据库操作(上)
Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...
- Django与数据库操作
Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接) Flask,tornado --- pymysql SQLArch ...
- django models数据库操作
一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import models class userinfo(models.M ...
- 03: Django Model数据库操作
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- django中数据库操作——in操作符
django一对多关系中,为了实现按照一端查询多端,之前都是用extra操作符,经过查看官方文档还有in这个操作符,用这个实现更简单.直接上代码: 根据查询条件模糊查询所有符合条件的机架列表,然后根据 ...
- django 快速数据库操作,不用SQL语句
配置models文件 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import mod ...
随机推荐
- CentOS随笔 - 2.CentOS7安装ftp支持(vsftpd)
前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 在前一篇文章中介绍了在虚拟机中安装CentOS7, 接下来就要进行配置了, 第一个就是安装ftp支持. 要不然 ...
- [翻译] ABPadLockScreen
ABPadLockScreen ABPadLockScreen aims to provide a universal solution to providing a secure keypad/pi ...
- Google论文系列(2) MapReduce
思想 map函数:处理一组key/value对进而生成一组key/value对的中间结果 reduce函数:将具有相同Key的中间结果进行归并 实现 环境 普通带宽,上千台机器(失败变得正常),廉价硬 ...
- 浅析Linux操作系统是如何工作的(思维导图)
SA***189 多任务计算机运转机制如下思维导图所示: 小结: Linux操作系统是一个在时钟的节拍下,各个模块紧密协作.密不可分的整体,而整个Linux系统都是建立在存储程序的基础之上,正是有了程 ...
- Linxu下 expect的安装与使用
expect学习 1.什么是except Expect是基于Tcl的一个相对简单的免费脚本文件语言工具,用于实现自动和交互式程序进行通信 is a software ...
- January 05 2017 Week 1st Thursday
The true nobility is in being superior to your previous self. 真正的高贵在于超越过去的自己. I will be satisfied if ...
- Vue-Router基础使用
作为Vue生态系统里面的一大成员,Vue-Router主要负责vue中的页面路由及其传值问题. 1.基本使用–添加路由 基本使用主要包括四个部分,页面引入.配置路由数组.实例化路由.把实例化的路由加入 ...
- Mac下的mongodb安装
mac下的mongodb安装主要有两种方式,一是手工安装,需在官网下载源文件,二是通过homebrew,至于homebrew不做介绍.既然是Mac系统下,我认为直接通过homebrew安装最好,省事还 ...
- python strip()
函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头 ...
- ALICE源代码分析
前言 ALICE(爱丽丝)事实上是"人工语言计算机实体"的英文缩写. 它以前在往年(2000年.2001年和2004年)的勒布纳人工智能奖角逐中三次获胜.并在其它年度中也获过骄人的 ...