django系列5.1--ORM对数据库的操作

Django--—ORM数据库操作(图书管理系统基本实例)

一.基本知识

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

ORM:对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。 从效果上说,它其实是创建了一个可在编程语言里使用的-–“虚拟对象数据库”。

FBV (function base views)就是在视图里使用函数处理请求。

CBV(class base views) 就是在视图里使用类处理请求。


二.为项目添加新app

注意新添加app时应在配置文件中的INSTALLED_APPS中写入我们创建的app名称

INSTALLED_APPS = ['django.contrib.admin',  #这是django给你提供的一些特殊功能的配置(应用,只是咱们看不到),也在应用这里给配置的,这些功能如果你注销了,那么我们执行同步数据库指令之后,就不会生成那些django自带的表了。因为执行数据库同步语句的时候,django会找这里面所有的应用,找到他们的models来创建表'django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',"book"  #直接写app的名字也行,写'app01.apps.App01Config'也行
]


三.创建与数据库的连接

1.此时首先应建立一个mysql数据库,这里我创建的数据库名为orm

2.settings.py文件中配置数据库连接,(创建项目时有默认的语句,找到DATABASES后修改补全即可)

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 连接的数据库类型'NAME': 'orm',  # 数据库名称'USER':'root',  # 用户名'PASSWORD':'123','HOST':'127.0.0.1','PORT':3306# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),  # 创建项目时默认用的数据库类型}
}

sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__.py,在里面写入:


3.在项目app中的__init__.py 输入下面代码

import pymysqlpymysql.install_as_MySQLdb()


4.创建数据库表.先创建模式,项目目录下的models.py

from django.db import models# Create your models here.
class Book(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=32)pub_date = models.DateField()price = models.DecimalField(max_digits=8,decimal_places=2)publish = models.CharField(max_length=20)def __str__(self):  # 这里用来以后对数据库操作时在控制台输出titile名称return self.title


5.需要在terminal中输入两行命令

python3 manage.py makemigrations   # 创建脚本
python3 manage.py migrate   # 迁移


6.查看执行的sql语句

在settings.py文件中加入

查看数据库执行代码
LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}
}


四.单表操作

在views.py中添加对数据库的操作语句

#在逻辑代码中导入你要操作的表
from app import modelsdef add_book(request):'''添加表记录:param request: http请求信息:return:'''models.Book(title='人间失格',price=12,pub_date='2012-12-12',publish='文学出版社')

1.添加表记录

方式1:实例化对象就是一条表记录

from app import modelsobj = models.Book(title='复活',price=12,pub_date='2012-12-12',publish='小出版社')
obj.save()

方式2:(我们一般使用方式二添加)

models.Book.objects.create(title='复活',price=12,pub_date='2012-12-12',publish='小出版社')


2.查询表记录

查询所有的记录:

obj = models.Book.objects.all()

使用values的结果:

obj = models.Book.objects.all().values()
# <QuerySet [{'id': 1, 'title': '雪国列车2', 'pub_date': datetime.date(2012, 12, 1),


常用的查询API:

<1> all():                  查询所有结果,结果是queryset类型<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,结果也是queryset类型 Book.objects.filter(title='linux',price=100) #里面的多个条件用逗号分开,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。  Book.objects.get(id=1)<4> exclude(**kwargs):      排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是queryset类型 Book.objects.exclude(id=6),返回id不等于6的所有的对象,或者在queryset基础上调用,Book.objects.all().exclude(id=6)            <5>  order_by(*field):       queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型
models.Book.objects.all().order_by('price','id') #直接写price,默认是按照price升序排列,按照字段降序排列,就写个负号就行了order_by('-price'),order_by('price','id')是多条件排序,按照price进行升序,price相同的数据,按照id进行升序<6> reverse():              queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型<7> count():                queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。<8> first():                queryset类型的数据来调用,返回第一条记录 Book.objects.all()[0] = Book.objects.all().first(),得到的都是model对象,不是queryset<9> last():                queryset类型的数据来调用,返回最后一条记录<10> exists():              queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False.   空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits例:all_books = models.Book.objects.all().exists() #翻译成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通过limit 1,取一条来看看是不是有数据<11> values(*field):        用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列.model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。<12> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<13> distinct():            values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录


双下划线的单表查询

Book.objects.filter(price__in=[100,200,300]) #price值等于这三个里面的任意一个的对象
Book.objects.filter(price__gt=100)  #大于,大于等于是price__gte=100,别写price>100,这种参数不支持
Book.objects.filter(price__lt=100)  # 小于 同大于,不包含边界值
Book.objects.filter(price__range=[100,200])  #sql的between and,大于等于100,小于等于200
Book.objects.filter(title__contains="python")  #title值中包含python的
Book.objects.filter(title__icontains="python") #不区分大小写
Book.objects.filter(title__startswith="py") #以什么开头,istartswith  不区分大小写
Book.objects.filter(pub_date__year=2012)  # 日期查询,年份为2012的数据


关于value的用法

all_books = models.Book.objects.all().values('id','title')
print(all_books) 
#<QuerySet [{'title': 'linux', 'id': 6}, {'title': '你好', 'id': 7}, {'title': 'linux', 'id': 8}, {'title': 'xxx', 'id': 9}, {'title': 'gogogo', 'id': 10}]>'''values做的事情:ret = [] #queryset类型for obj in Book.objects.all():temp = {  #元素是字典类型'id':obj.id,'title':obj.title}ret.append(temp)'''

关于时间问题:日期查询

all_books = models.Book.objects.filter(pub_date__year=2012)   # 找2012年的所有书籍
all_books = models.Book.objects.filter(pub_date__year__gt=2012)  # 找大于2012年的所有书籍
all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2)  # 找2019年月份的所有书籍,如果明明有结果,你却查不出结果,是因为mysql数据库的时区和咱们django的时区不同导致的,了解一下就行了,你需要做的就是将django中的settings配置文件里面的USE_TZ = True改为False,就可以查到结果了,以后这个值就改为False,而且就是因为咱们用的mysql数据库才会有这个问题,其他数据库没有这个问题。

当查询日期出现问题时:

将settings.py中最下面的USE_TZ = False改为True

1547033-20190227221806360-232121589.png

USE_TZ = True

不是跨时区的应用,不需要考虑时区问题,就将这个值改为False,mysql是对时区不敏感,django往mysql里面出数据的时候,如果这里的值为True,那么将让mysql强制使用UTC时间,那么我们存储进入的时间,当你查询的时候,你就会发现,时间晚了8小时,也就是说你存时间的时候被改为了UTC时间,本地是东八区,比UTC时间多8小时


3.修改表记录

update只能是QuerySet类型才能调用,model对象不能直接调用更新方法,所以使用get方法获取对象的时候是不能使用update方法的

Book.objects.filter(title__startswith="复活").update(price=12)

注意:

<input type="date" class="form-control" id="book_pub_date" placeholder="出版日期" name="book_pub_date" value="{{ edit_obj.pub_date|date:'Y-m-d' }}">

type='date'的input标签,value的值必须是'Y-m-d'的格式,这个标签才能认识并被赋值,所以,要通过date过滤给它改变格式。


4.删除表记录

删除方法.delete()的调用者可以是一个model对象,也可以是一个queryset集合.它运行时立即删除对象而不返回任何值,也可以一次删除多个对象.每个queryset都有一个delete()方法

models.Book.objects.filter(title='复活').delete()  # 删除标题为复活的Book对象

任何情况下,QuerySet中的delete()方法都只使用一条SQL语句一次性删除所有对象,而并不是分别删除诶个对象,如果想使用model中自定义的delete()方法,就要自行调用每个对象的delete()方法(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。

在Django删除对象时,会模仿SQL约束 ON DELETE CASCDE的行为(删除一个对象时也会删除与它相关联的外键对象)

b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

Entry.objects.all().delete()

转载于:https://www.cnblogs.com/robertx/p/10447094.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第七届决赛JAVA真题----路径之谜

路径之谜小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。按习俗&#xff0c;骑士要从西北角走到东南角。 可以横向或纵向移动&#xff0c;但不能斜着走&…

蓝桥杯第七届决赛JAVA真题----广场舞

广场舞LQ市的市民广场是一个多边形&#xff0c;广场上铺满了大理石的地板砖。 地板砖铺得方方正正&#xff0c;就像坐标轴纸一样。 以某四块砖相接的点为原点&#xff0c;地板砖的两条边为两个正方向&#xff0c;一块砖的边长为横纵坐标的单位长度&#xff0c;则所有横纵坐标都…

oracle的关键字

oracle使用管理员执行下面命令&#xff0c;就能获得oracle的关键字&#xff1a; select * from v$reserved_words order by keyword asc; 以下是oracle 11.2.0.1.0中执行的结果&#xff08;供参考&#xff09;&#xff1a; 转载于:https://www.cnblogs.com/zhaoqian49/p/104490…

poj1279

板子题&#xff0c;求多边形内核面积。 话说jls的板子返回的是边&#xff0c;然后我就在冥思苦想怎么根据割边求面积啊。。 然后发现自己果然是个傻逼&#xff0c;求一下交点存起来就好了。。。 //板子题到此为止了 1 #include <iostream>2 #include <cstdio>3 #in…

回溯法在解决八皇后问题中的应用

回溯法&#xff1a;有这样一类题目&#xff0c;它们要求在相对问题的输入规模按照指数速度增长&#xff08;或者更快&#xff09;的域中&#xff0c;找出一个具有指定特性的元素。例如&#xff1a;在图顶点的所有排列中求一个哈密顿回路&#xff0c;在背包问题的一个实例中求其…

python数据结构与算法之问题求解

懂得计算机的童鞋应该都知道&#xff0c;一条计算机程序由数据结构跟算法两大部分组成。所以&#xff0c;其实不管你使用哪种计算机语言编写程序&#xff0c;最终这两部分才是一个程序设计的核心。所以&#xff0c;一个不懂得数据结构与算法的程序员不是一个好工程师。因此&…

运用tp5上传图片,并生成缩略图

最近想做个相册&#xff0c;需要用到上传图像&#xff0c;并且考虑到性能问题&#xff0c;还要生成缩略图&#xff0c;就学习下。在网上看了很多大神写的文章&#xff0c;经过各种调试总算出来了&#xff0c;分享下。不好之处&#xff0c;多多指教 ​ ​ ps&#xff1a;运用tp5…

求解最长回文子串----Manacher 算法

最长回文子串问题&#xff1a;给定一个字符串&#xff0c;求它的最长回文子串长度。 如果一个字符串正着读和反着读是一样的&#xff0c;那么我们称之为回文串。例如&#xff1a;abba、aaaa、abvcba、123321等 暴力法&#xff1a;遍历字符串的所有子串&#xff0c;对每个字串进…

Peter's smokes -poj 2509

题意&#xff1a;彼得有n支雪茄&#xff0c;每k个烟头可以换一支新雪茄&#xff0c;问彼得最多可以吸多少支雪茄 &#xff1f; 当时自己做时&#xff0c;错在了直接在while循环开始前&#xff0c;便将雪茄的初始数量给加上了&#xff0c;然而应该是先处理后再加上最终剩余的雪茄…

模式匹配算法----KMP算法以及next数组的解法

KMP算法&#xff1a;求字符串匹配&#xff08;也叫模式匹配&#xff09;的算法&#xff0c;即给定一个字符串&#xff0c;求其某一子串在其中出现的位置。 普通模式匹配 例如&#xff1a;给定字符串为abcabaaabaabcac&#xff0c;求其子串abaabcac在其中出现的位置。 结果为…

Spring Boot使用layui的字体图标时无法正常显示 解决办法

在html文件使用字体图标并且预览时正常&#xff0c;但是启动工程后显示不正常&#xff0c;浏览器调试界面显示字体文件无法decode&#xff1a; Failed to decode downloaded font: xxxxx 如图所示&#xff1a; 显示结果&#xff1a; 原因&#xff1a;经过maven的filter&#xf…

蓝桥杯第七届国赛JAVA真题----机器人塔

机器人塔X星球的机器人表演拉拉队有两种服装&#xff0c;A和B。 他们这次表演的是搭机器人塔。 类似&#xff1a;队内的组塔规则是&#xff1a; A 只能站在 AA 或 BB 的肩上。B 只能站在 AB 或 BA 的肩上。你的任务是帮助拉拉队计算一下&#xff0c;在给定A与B的人数时&…

Python divmod() 函数

Python divmod() 函数 Python 内置函数 python divmod() 函数把除数和余数运算结果结合起来&#xff0c;返回一个包含商和余数的元组(a // b, a % b)。 在 python 2.3 版本之前不允许处理复数。 函数语法 divmod(a, b)参数说明&#xff1a; a: 数字b: 数字实例 >>>div…

蓝桥杯第六届省赛JAVA真题----垒骰子

垒骰子 赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。 经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01; 我们先来规范一下骰子&#xff1a;1 …

并发队列、线程池、锁

1、CountDownLatch(计数器) CountDownLatch 类位于java.util.concurrent包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务A&#xff0c;它要等待其他任务执行完毕之后才能执行&#xff0c;此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是…

蓝桥杯第七届省赛JAVA真题----剪邮票

剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来&#xff0c;要求必须是连着的。 &#xff08;仅仅连接一个角不算相连&#xff09; 比如&#xff0c;【图2.jpg】&#xff0c;【图3.jpg】中&#xff0c;粉红色所示部分就是合格的剪取。 请你…

目标检测之YOLO V2 V3

YOLO V2 YOLO V2是在YOLO的基础上&#xff0c;融合了其他一些网络结构的特性&#xff08;比如&#xff1a;Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷积核等&#xff09;&#xff0c;进行的升级。其目的是弥补YOLO的两个缺陷&#xff1a; YOLO中的大量的定位错误和基于区域…

蓝桥杯第八届省赛JAVA真题----迷宫

标题&#xff1a;迷宫 X星球的一处迷宫游乐场建在某个小山坡上。 它是由10x10相互连通的小房间组成的。 房间的地板上写着一个很大的字母。 我们假设玩家是面朝上坡的方向站立&#xff0c;则&#xff1a; L表示走到左边的房间&#xff0c; R表示走到右边的房间&#xff0…

掌握MySQL数据库这些优化技巧,事半功倍!

一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的&#xff0c;它是随着用户量的增加&#xff0c;基础架构才逐渐完善。这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案&#xff0c;暂且抛开前端应用不说&#xff0c;大致分为以下五个阶段&am…

蓝桥杯第八届省赛JAVA真题----方格分割

标题&#xff1a;方格分割 6x6的方格&#xff0c;沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。 如图&#xff1a;p1.png, p2.png, p3.png 就是可行的分割法。 试计算&#xff1a; 包括这3种分法在内&#xff0c;一共有多少种不同的分割方法。 注意&#xff…