Django:模型_数据库基础

数据库

1、在网站开发中,数据库是网站的重要组成部分。只有提供数据库,数据才能够动态的展示,而不是在网页中显示一个静态的页面:视图函数从数据库中获取数据,然后在通过模板HTML进行显示,从而实现数据动态显示

2、目前市面上有很多种类的数据库,比如有SQL Server、Oracle、Mysql等等,由于Mysql价格实惠、简单易用、不受平台限制、灵活性高等特性,目前已经取得了绝大多数的市场份额。因此在后面的学习中,就用Mysql来作为数据存储了。

Mysql驱动程序

1、要使用Django来操作Mysql,实际上底层还是通过Python来操作的。因此我们想要用Django来操作Mysql,首先还是需要安装一个驱动程序。在Python3中,驱动程序有很多选择,比如pymysql、Mysqlclient等。这里我们将使用Mysqlclient来操作。Mysqlclient的安装非常简单,只需要通过pip install mysqlclient即可安装
    ⑴如果使用pip安装时报错了,那可以去Python的组件库中去下载包来手动安装:https://www.lfd.uci.edu/~gohlke/pythonlibs/,下载.whl包后,进入到对应目录然后使用pip install 报名.whl即可

2、常见的Mysql驱动:
    ⑴mysql-python:也就是Mysqldb,其是对C语言操Mysql数据库的一个简单封装。遵循了Python DB API V2。但是只支持Python2
    ⑵mysqlclient:是Mysql-python的另外一个分支。支持Python3
    ⑶pymysql:纯Python实现的一个驱动,因为是纯Python写的,因此执行效率不如Mysql-python,但是可以与Python代码无缝衔接
    ⑷上面几个驱动中目前我只学习过pymysql的使用,不过好像这几种驱动在函数方法上都是一样的,只是说底层实现上不一样,效率就会不一样

Django配置数据库连接

1、在操作数据库之前,首先要连接数据库。这里我们以配置Mysql为例来介绍

2、Django连接数据库,不需要单独创建一个连接对象,只需要在settings.py文件中做好数据库相关的配置就可以了

注:
1、"不需要单独创建一个连接对象"的意思是:比如我们在Python脚本中操作数据库时,首先需要使用connect()函数来连接数据库(pymysql中:其返回一个连接对象),然后在使用cursor()函数来获取连接对象(数据库)的游标对象,进而使用游标对象来操作数据库的增删改查。而在Django中,就不需要再单独使用connect()函数来连接数据库了,只需要在settings.py文件中配置好数据库信息,那么就默认是连接上了数据库的

2、在Django中只需要导入"from django.db import connection"后再使用connection.cursor()就可以直接获取数据库的游标对象了。在获取游标对象时,Django就会自动去settings.py中读取数据库的配置进行连接。而不再需要什么连接函数之类的了(不需要使用connect()函数取连接数据库了)

数据库配置

说明:

'ENGINE' 数据库引擎,常见的有sqlite3、mysql、oracle等
'NAME' 所连数据库的名字
'USER' 所连数据库的用户名
'PASSWORD' 所连数据库的密码
'HOST' 所连数据库所在的主机地址。这里用的是本地的数据库,因此为127.0.0.1
'PORT' 所连数据库的端口号

注:在网上的教程中看到还有这么一步,但是我在实际中也没进行这步还是正常使用的

在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:

import pymysql

pymysql.install_as_MySQLdb()

在Django中操作数据库

1、在Django中操作数据库有两种方式:第一种方式就是使用原生的SQL语句来操作,第二种就是使用ORM模型来操作。这里先介绍下使用原生SQL语句来操作的例子
    ⑴原生SQL语句:就是常见的insert、delete、update、select
    ⑵ORM模型:现在简单的来说就是通过类和类对象就能操作它所对应的数据库中的数据 

2、在Django中使用原生的SQL语句来操作其实就是使用python db api的接口来操作。如果驱动使用的是pymysql,那么就必须使用pymysql来操作,只不过Django将数据库连接这一部分封装好了,只需要在settings.py中配置好数据库连接信息后直接使用Django封装好的接口就可以操作了

例1:使用原生SQL语句插操作
⑴编辑视图

⑵访问

⑶查看数据库

例1_1:使用原生SQL语句查操作
⑴编辑视图

⑵编辑模板

⑶访问:有数据时

⑷访问:无数据时

注:
1、因为返回的数据有两个可能:有数据和无数据,所以一开始想的是使用for...in...empty标签,结果发现,数据为空时还是会显示表头,所以感觉不行。所以就想先判断返回的数据是否为空(后面想了下感觉如果要使用这种办法的话可以将for...in...empty标签放在表头HTML代码前)

2、然后,一开始想过在视图函数中判断返回的数据是否为空,为空时返回一个字符串,有值时就返回数据。但是由于在模板HTML中数据是按表格来显示的,如果数据库返回为空,那视图函数传给模板的就是个字符串,一个字符串又不能通过表格来显示,然后又觉得不得行

3、所以最后,想的就是在模板就使用if标签就行判断了,有数据时就使用for标签,无数据时就直接显示

4、因为这才是刚开始,可能有些方法自己还想不到,只能根据实际来选择实现的方式了

 

使用原生SQL来操作数据库实例

1、需求描述:首页

2、需求描述:图书详情

3、需求描述:发布图书

4、需求描述:思维导图

5、编辑功能模板:通过查需求会发现几个页面中网页顶部是一样的,因此这部分可以共用

6、编辑功能模板CSS文件

7、编辑首页视图

8、编辑首页模板

注:
1、需要注意的是:在访问"首页"时,就会执行对应的视图函数。进而从数据库中返回图书的信息(具体返回哪些数据由视图函数中的SQL语句决定,比如这里返回的是图书所有信息数据)。

2、上面模板代码中显示的图书序号是通过forloop.counter获取的,这个序号并不是数据库中图书的ID,图书的ID是通过变量"result.0"获取的,只是在页面中没有对其显示(虽然不会显示在网页上,但是还是会获取这个数据:由视图函数中的SQL确定返回那些数据),并将其用于URL跳转了

3、点击"图书名字"进行跳转时,所跳转到的URL中的图书id参数是在访问"首页"时获得的(book_detail_Id=result.0)。即从A页面跳转到B页面时,如果B页面的URL需要传递参数,那么这个参数肯定是在A页面中获取的,而不是从B页面获取的(这个时候都还没访问B页面,肯定就不会从B页面获取到参数信息了)

4、"图书详情"页面是根据所选择的图书来决定显示什么的,因此在进行跳转时,肯定需要确定当前选择的图书是哪一个,并且告诉视图函数,你选择的是哪一个。因此就选择了数据库的主键(图书ID)来当做标识并通过URL来传递这个参数值给视图函数


9、编辑图书详情页面视图

10、编辑删除图书视图

11、图书详情页面模板

注:
视图函数传递给模板的变量:只能在该视图函数对应的模板中使用,其他模板是获取不到另一个视图函数传递给其模板的变量的(该模板与其他模板没有继承关系之类的)

⑵从视图函数中传递给模板的变量只能在对应的模板中使用(模板没有继承关系之类的):A视图传递给其对应a模板的变量,只能在a模板中使用,而不能在b模板中使用,在b模板中是获取不到这个变量值的

⑶如这个例子中的:"首页"视图函数传递给"首页"模板的变量result变量,是不能在"图书详情"模板中使用的(它们两个之间没有继承关系之类的)
    ①"首页"页面与"图书详情"页面两者之间唯一的关系就是:"图书详情"页面是通过"首页"页面中的context变量中的图书id跳转过来的,但是这个图书id变量也是在"首页"页面中获取和使用的
    ②"图书详情"页面的变量detail_result也是通过视图函数重新查询数据库获得的,进而传递给其"图书详情"模板的。这里为了区分特意把两个变量名设置为了不一样的
    ③进行图书删除操作时,使用的变量也是"图书详情"视图函数重新查询数据库获得的,也不能使用"首页"模板中的变量:虽然它们对应的视图函数不一样,但是它们在同一个模板中,所以可以共用变量(其实这里也不算是公用变量,首先图书详情视图传递图书信息变量context给这个模板,然后再在这个模板中获取了图书id,并将这个图书id传递给删除图书视图,这个过程是模板变量到视图函数,而不是视图函数到模板变量)

⑷从A页面跳转到B页面,在跳转时如果B页面的URL需要参数,那这个参数肯定是在A页面就获取到了的,而不是说在B页面获取的,这个时候都还没有访问到B页面,肯定不会从B页面获取参数之类的

12、编辑添加图书视图

13、URL请求方式
    可以从后台URL的访问记录可以看出:一个相同的URL可以有不同的请求方式

注:
请求一个页面时可能会有两种方式:GET和POST。比如这个"发布图书"的页面中就同时用到两get和post请求方式,并且这两种请求方式针对的操作也是不一样的,因此需要在视图函数中对请求方式进行判断
    ①当只是访问这个URL请求数据时(从数据库中获取数据),就只是单纯GET请求:因此这时候只需要返回对应的数据就可以了
    ②当访问这个URL后,并且需要提交数据到数据库时,这就大部分就是POST请求了(当然提交数据也有可能是GET请求,只是说POST方式提交数据要安全点)
    ③当一个页面全部都是GET请求时,在写视图函数时就不需要对请求方式进行判断了。如果一个页面中既有GET又有POST时,在编写视图函数时就需要进行判断了。所以在编写视图函数和模板时一定要考虑清楚对应的请求方式

⑵视图函数中的request.POST.get("bookName")表示:
    ①request:表示request对象,其包含了客户端向服务器发送过来的所有数据(其中就有表单信息、查询字符串参数等,反正就是所有数据)
    ②request.POST:客户端请求的方式为POST,因此就使用request.POST,与之对应的就是request.GET了(表示请求方式为GET)。request.POST返回的是一个类字典型的数据
    ③request.POST.get():request.POST返回的是一个类字典型的数据(request.GET也是),因此可以使用Python中字典的方法来获取字典中对应键的值了("bookName")。当然也可以使用request.POST["bookName"]
    ④表单中提交上来的数据,是以键值对的形式存在的:其键为HTML模板中name属性定义的,其值为在表单中填写的数据

⑶从上面的例子中也可以看出,在Django中操作数据库进行"插"操作的时候,也不需要提交事务(commit函数):这一点也是与在Python脚本中操作数据库不一致的地方,在Python脚本中,执行insert语句后,必须使用commit()函数来提交事务,不然不会保存

14、编辑添加图书页面模板

15、项目URL

注:
这个例子就是完全使用了原生SQL语句来写的项目:也就是通过在视图函数中执行不同的SQL语句来达到不同的目的。但是这样的话(使用原生SQL),维护成本比较大且SQL语句比较复杂的时候,很容易出错。所以更好的方式就是使用ORM模型

发布了9 篇原创文章 · 获赞 0 · 访问量 225

猜你喜欢

转载自blog.csdn.net/zh18380113164/article/details/105151327
今日推荐