上一篇博文学习了Django的form和template。到目前为止,我们所涉及的内容都是怎么利用Django在浏览器页面上显示内容。WEB开发除了数据的显示之外,还有数据的存储,本文的内容就是如何在前面所学知识的基础上进一步利用Django和mysql数据库进行数据的存储。

在介绍如何利用Django和数据进行数据存储之前,先说一说Django提供的ORM(Object Relational Mapping)框架。

Object Relational Mapping 翻译成中文就是“对象关系映射”。这里的“对象”和编程语言中“面向对象编程”中的“对象”是一个概念;“关系”是指关系型数据库中的表(数据库有关系型数据库(mysql)和非关系型数据库(mongodb)),“映射”就是把这两者(“对象”和“关系型数据库的表”)连接起来,这样在进行开发的时候就可以通过操作对象来实现对数据库中表内容的操作。在Django中一个model类一般对应关系数据库中的一张表。概念先讲到这里,要真正理解需要在实际代码中体会。下面步入正题:

0 数据库的准备工作

0.1 mysql数据库安装:

ctrl+Alt+t打开终端,输入:sudo apt-get install mysql-server安装mysql数据库.安装期间有提示设置root用户的密码,一定要记住自己设置的root密码!!!(博主第一次安装的时候没在意,随便输了一个密码,安装完想不起来了)。mysql安装完之后在终端输入:mysql -u root -p ,会提示需要密码,这时候输入刚才设置的root用户的密码,进入mysql shell

0.2 设置mysql的数据库编码方式:

mysql默认的字符存储编码方式在进行中文存储的时候会出现乱码,在正式使用mysql数据库之前,我们先把编码方式处理好,在mysql shell 中输入show variables like '%char%'; 结果应该如下(我的数据库编码已经修改好了,这里只好引用别人的图片了):

.

这说明数据库的编码方式是latin1.我们需要修改mysql的配置文件把编码方式指定utf-8,mysql的配置文件位于/etc/mysql目录下:

先在mysql shell 中输入quit退出MySQL shell.然后输入

cd /etc/mysql 进入mysql配置文件目录,sudo gedit ./my.cnf 编辑my.cnf把文件的配置部分改成下方所示:

  1. !includedir /etc/mysql/conf.d/
  2. !includedir /etc/mysql/mysql.conf.d/
  3. [client]
  4. default-character-set=utf8
  5. [mysqld]
  6. default-storage-engine=INNODB
  7. character-set-server=utf8
  8. collation-server=utf8_general_ci

保存后退出编辑.数据库的编码方式就改成utf8了.

再次输入mysql -u root -p 进入mysql shell,输入create database DjangoDB创建一个名为DjangoDB的数据库.创建成功会提示OK.

0.3 setting.py设置后台数据库指向

Django默认的数据库是sqlite3,除了sqlite3外Django支持的其他关系型数据库请看这里,但是实际生产环境一般不用sqlite3,这里我们使用mysql作为后台数据库.打开项目文件目录下的setting.py.找到数据库的设置部分:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',#默认使用sqlite3数据库
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. }
  6. }

把数据库配置的部分修改为:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',#使用mysql数据库
  4. 'NAME': 'DjangoDB',#指向刚才新建的DjangoDB数据库
  5. 'USER':'root',#连接数据库时使用的用户名
  6. 'PASSWORD':'000000',#连接数据库时用户的密码
  7. 'ALLOWED_HOSTS':'127.0.0.1',#数据库所在服务器的IP地址.因为使用的是装在本机的mysql数据库,这里填127.0.0.1
  8. 'PORT':'3306',#数据库服务的监听端口号,mysql默认是3306
  9. }
  10. }

到这里,前期与数据库相关的准备算是做完了.

1 定义一个用户model

编辑myBolg文件目录下的models.py定义一个用户类,也就是所谓的'对象':

  1. from django.db import models
  2. # Create your models here.
  3. class BlogUser(models.Model):
  4. SEX_CHIOCES=(
  5. (1,'男'),
  6. (2,'女'),
  7. )
  8. username=models.CharField('用户名',max_length=100)
  9. email=models.EmailField('邮箱地址',max_length=100)
  10. password=models.CharField(max_length=100)
  11. gender=models.CharField('性别',max_length=30,choices=SEX_CHIOCES)
  12. registedDate=models.DateTimeField('注册时间',auto_now_add=True)#auto_now=True创建用户的同时使用当前时间作为registedDate的值
  13. def __str__(self):
  14. return self.username

跟视图类,django form一样,自定义model必须要继承models.Model类.在BlogUser类,我们定义了5个属性:'username','email','password','gender','registedDate'.

到这里,我们有了数据库,也定义好了'对象',下面就是要把他们关联起来了.

2 数据库与model的关联和同步

执行python manage.py makemigrations命令,会提示创建一个BlogUser的model.并且在myBlog的migration文件目录下面会生成一个0001_initial.py的文件.

接着执行 python manage.py migrate 命令.这时候可能会报错,提示是至少需要mysqlclientxxx版本以上当前版本过低.这时候需要安装mysqlclient的最新版.在终端输入pip install mysqlclient进行安装(如果django版本低于2.0还需要进行额外的操作请看这里).安装完成之后执行python manage.py migrate 输出如下图,则说明数据库的表和model关联起来了:

.

3 TestCase测试

养成定义一个类或者某个方法之后进行单元测试,对开发人员来说是一种良好的习惯.通过上面的步骤我们把model和数据库表联系起来了.接着是做单元测试,编辑myBlog下的tests.py文件:

  1. from django.test import TestCase
  2. from myBlog.models import BlogUser #导入BlogUser类
  3. # Create your tests here.
  4. class BlogUserTestCase(TestCase):
  5. def create_test(self):#测试是否能够新建或更新BlogUser
  6. test_user,created=BlogUser.objects.update_or_create(username='test_blog_user',email='test@.163.com',password='test',gender='M')
  7. print(test_user)

然后在终端执行:

./manage.py test myBlog.tests.BlogUserTestCase.create_test

命令,输出如下,说明数据库链接没问题,BlogUser也没问题:

.

更多关于django单元测试的内容请点这里.

4.在视图类中使用model

编辑myBlog文件目录下的views.py,先导入BlogUser

  1. from myBlog.models import BlogUser

然后在RegisterView这个视图类下增加一个用于处理POST请求方式的方法post():

  1. def post(self,request):
  2. template_name='register.html'
  3. form=RegisterForm(request.POST)
  4. if form.is_valid():#判断form是否可用
  5. if form.cleaned_data['password']==form.cleaned_data['password_check']:#检查前后密码是否一致,这个工作可以在页面用JS脚本检查一次,后台再检查一次
  6. try:
  7. b_user,created=BlogUser.objects.update_or_create(username=form.cleaned_data['username'],email=form.cleaned_data['Email'],password=form.cleaned_data['password'],gender=form.cleaned_data['gender'])#update_or_create返回的是一个(istance,boolean)形式的tuple,instancemodel的实例,如果是创建实例boolean=Ture,如果是更新则为False
  8. return HttpResponse(b_user.username+'用户创建成功')
  9. except Exception as e:
  10. return HttpResponse('创建用户失败,出现异常:'+e.messages)
  11. else:
  12. HttpResponse('前后密码不一致,用户创建失败')
  13. else:
  14. return render(request,template_name,{'reg_form':form}) #返回请求的响应,并且渲染模板

然后编辑template文件下的register.html,添加CSRF的防护:

  1. <!DOCTYPE html>
  2. <html lang="en" dir="ltr">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>用户注册页面</title>
  6. </head>
  7. <body>
  8. <form class="" action="" method="post">
  9. {% csrf_token %}<!--CSRF安全保护 -->
  10. {{ reg_form }}<!--占位符-->
  11. <button type="submit" name="sub_btn">确认注册</button>
  12. </form>
  13. </body>
  14. </html>

注意:from的action=''是指post请求提交到当前页面所在的url.

保存后启动服务python manage.py runserver

浏览器访问'127.0.0.1:8000/blog/registe'填写信息:

.

提交后:

.

这时候BlogUser的信息已经写到mysql后台数据库DjangoDB里面了.我们可以去mysql查验一下:

Ctrl+alt+t打开另一个终端,mysql -u root -p输入密码后进入mysql shell

在mysql shell下输入

use DjangoDB;进入DjangoDB这个数据库,提示Database changed 说明进入DjangoDB数据库成功.接着输入select * from myBlog_bloguser可以看到用户信息已经保存入myBlog_bloguser这张表里面了:

.

Django基础四(model和数据库)的更多相关文章

  1. Django基础四之测试环境和ORM查询

    Django基础四之测试环境和ORM查询 目录 Django基础四之测试环境和ORM查询 1. 搭建测试环境 1.1 测试环境搭建方法: 1.2 使用测试环境对数据库进行CURD 1.3 返回Quer ...

  2. day 68 Django基础四之模板系统

      Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关 ...

  3. day 54 Django基础四之模板系统

    Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模 ...

  4. Django基础四<二>(OneToMany和 ManyToMany,ModelForm)

    上一篇博文是关于setting.py文件数据库的配置以及model与数据库表关系,实现了通过操作BlogUser,把BlogUser的信息存入后台数据库中.实际开发中有许多东西是相互联系的,除了数据的 ...

  5. Django:模型model和数据库mysql(一)

    以一个栗子尝试来记录: 两个表存储在数据库中,BookInfo表示书,HeroInfo表示人物.一本书中有多个人物 在MySQL中新建一个数据库Django1,不用创建表,用Django模型来配置数据 ...

  6. Django基础四之模板系统

    一 语法   模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使 ...

  7. 04.Django基础四之模板系统

    一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{ ...

  8. 小白学习django第四站-关联数据库

    使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...

  9. python django基础四 ORM简介

    ORM,全称是object relation mapping.翻译过来,就是对象关系映射. 主要来学习MySQL操作,MySQL是一个软件.它的优点:1.免费 2.开源 pymysql,就是Mysql ...

随机推荐

  1. python自动重试第三方包retrying

    最近写了一个爬虫,需要连接国外的一个网站,经常出现掉线的情况,自己写了一个自动重连的代码,但感觉不够简洁... 后来就上万能的github,找到了一个第三包,基本能满足我的要求.这个第三方包就是ret ...

  2. P3370 【模板】字符串哈希

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 输入输出格式 输入格式: 第一行包含一个整数N,为字符串 ...

  3. Zabbix如何设置脚本告警

    设置告警脚本的路径 # vim /etc/zabbix/zabbix_server.confAlertScriptsPath=/usr/lib/zabbix/alertscripts 创建脚本 在这里 ...

  4. IIR滤波器软件实现(Matlab+C++)

    使用C++来写一个IIR滤波器 我们首先要在MATLAB中设计一个IIR滤波器,并生成一个头文件,这个头文件中反映了IIR滤波器的频率响应特性 理论支持 IIR滤波叫做递归滤波器,它是一种具有反馈的滤 ...

  5. No module named zope.interface error的解决

    明明安装了 zope.interface,还是出现标题错误,错误语句是 from zope.interface import ooxx 根据 http://stackoverflow.com/ques ...

  6. linux常用命令合集(未完)

    (1)新建 新建文件夹:mkdir 文件夹名 新建文件:touch 文件路径/文件名 删除: rm –f filename删除文件 rm –rf filename删除文件夹 (2)重命名 1将一个名为 ...

  7. 关于Elasticsearch 使用 MatchPhrase搜索的一些坑

    对分词字段检索使用的通常是match查询,对于短语查询使用的是matchphrase查询,但是并不是matchphrase可以直接对分词字段进行不分词检索(也就是业务经常说的精确匹配),下面有个例子, ...

  8. Python进阶开发之元类编程

    系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多 ...

  9. 团队项目第二阶段个人进展——Day5

    一.昨天工作总结 冲刺第五天,找到了一个专门的提供后端数据服务的网站:leancloud,并学习了相关操作 二.遇到的问题 对leancloud的数据如何请求和响应不懂 三.今日工作规划 深入学习le ...

  10. 【转】详解JavaScript中的异常处理方法

    有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个 ...