Django 系列博客(四)

前言

本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改

ORM简介

ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。举例来说就是,我定义一个对象,那就对应着一张表,这个对象的实例,就对应着表中的一条记录。

比如在大名鼎鼎的 pythonWEB 框架 Django 就是使用了对象关系映射,这个对应 Django 中的 model文件。

  1. from django.db import models
  2. # Create your models here.
  3. class UserInfo(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=32)
  6. pwd = models.CharField(max_length=32)

通过对象关系映射,这个类就会对应数据库中的 UserInfo 表,里面有三个字段,id 为自增并且为主键,另外两个为 name 和 pwd 字段,都是可变长类型。

通过 orm 和数据库进行交互进行增删查改,获取的数据会在 views 文件中来进行逻辑判断。

数据返回

当前后端进行交互后需要往前端传送数据,在 Django 中有三种方式:

  1. render:返回一个模板(页面)

该函数有五个参数:

  • request:这是前端发过来的数据集合,里面可以获取表单中的数据,或者获取请求方式、状态码等;
  • template_name:这个是模板名称,模板为 templates 中的 index 文件;
  • context:内容,需要返回的数据,默认为 None;
  • content_type:数据内容类型,默认为 None;
  • using:未知。

当调用这个函数时,会找到模板文件,打开,如果 context 不为空的话,就会用 django 的模板渲染方式将数据加到模板中,然后返回给前端。

content为经过loader.render_to_string加工后的数据,然后经过 HttpResponse 类的实例化生成一个对象返回给前端,那么在前端可以通过对象的点语法进行取值。

  1. redirect:重定向到某个地址

查看源码可知,首先在 redirect 函数中进行了判断,假设该函数没有参数,只有一个重定向路径,也就是 to 这个参数,那么 redirect_class为 HttpResponseRedirect 类,然后进行实例化返回。

查看 resolve_rul源码,在里面对 to 变量进行了一些判断等工作然后再返回,返回之后经过 redirect_class类(在这里也就是 HTTPResponseRedirect)进行实例化,

查看源码:

发现状态码为302,然后进入 HTTPResponseRedirectBase,查看源码:

经过 HTTPResponseRedirect 实例化得对象返回到前端。

  1. HttpResponse:返回字符串。

这个类也是 render 和 redirect 需要调用的类来实例化对象。不过直接由 HttpResponse 类生成的对象是字符串,没有页面显示。

ORM 连接数据库

ORM 连接 sqlite3

  1. 配置 settings 文件

其实不用配置,默认就是连接 sqlite3

在 settings 里面有个数据库配置选项:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. }}

可以知道 django 默认的数据库引擎为 sqlite3,数据库名字为数据库的路径。连接数据分为两步:

  1. 在 models 中创建类和字段
  1. from django.db import models
  2. # Create your models here.
  3. class UserInfo(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=32)
  6. pwd = models.CharField(max_length=32)
  1. 把表同步到数据库(因为 orm 不能创建表,所以需要手动创建一个对应的数据库)。创建完成后在项目根目录下运行两条命令。

    • python3 manage.py makemigrations

    这条命令并没有将 models 中的表同步到数据库,只是在 migrations 中做了一个记录,并且会在 migrations 文件夹中生成一个0001_initial.py文件

    1. # -*- coding: utf-8 -*-
    2. # Generated by Django 1.11.9 on 2019-01-07 06:59
    3. from __future__ import unicode_literals
    4. from django.db import migrations, models
    5. class Migration(migrations.Migration):
    6. initial = True
    7. dependencies = [
    8. ]
    9. operations = [
    10. migrations.CreateModel(
    11. name='UserInfo',
    12. fields=[
    13. ('id', models.AutoField(primary_key=True, serialize=False)),
    14. ('name', models.CharField(max_length=32)),
    15. ('pwd', models.CharField(max_length=32)),
    16. ],
    17. ),
    18. ]

    • python3 manage.py migrate

    将数据表同步到数据库中

经过这两步会在数据库中创建出来一些表:

这些表都是什么意思呢?

第一张表app_userinfo为 models 中创建的类所对应的表(mysql 不区分大小写),并且会自动将 app 的名字拼接到表名之前,之后 auth 开头的表示关于认证的表,django 开头的表示 django 认证的表,目前来说不用关心。

ORM 连接Mysql

连接 mysql 也很简单,比连接 sqlite3多了两步,并且这两步是在之前就要进行的。

  1. 配置 settings 文件

因为是连接 mysql,所以 settings 中的数据库需要更改配置。

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'django_03',
  5. 'HOST': '127.0.0.1',
  6. 'PORT': 3306,
  7. 'USER': 'root',
  8. 'PASSWORD': 'password'
  9. }
  10. }

注意:default 对应的value 中的 key 必须使用大写,其他除了 ENGINE 一样外,其他的参数都需要根据自身的数据库来配置。配置成功后可以通过 pycharm 自带的数据库模块来进行测试是否连接成功:

连接成功会显示 successful。

  1. 配置 app 下的 init 文件,不要写错地方了
  1. import pymysql
  2. pymysql.install_as_MySQLdb()
  1. 在 models 中创建类和字段

和 sqlite3的一样,

  1. from django.db import models
  2. # Create your models here.
  3. class UserInfo(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=32)
  6. pwd = models.CharField(max_length=32)
  1. 把表同步到数据库
  1. #数据库表并没有同步到数据库,只是在migrations内做了一个记录
  2. -python3 manage.py makemigrations
  3. #才将数据表同步到数据库
  4. -python3 mangae.py migrate

使用 orm 进行增删查改

和数据库连接成功后,可以通过表所对应的对象来进行操作,在本文的数据库对象就是UserInfo.object,打印出来可知该对象是app.UserInfo.objects

通过这个这个类(对应数据库中的表)可以操作数据库

  1. # 该表有两个三个字段,其中 id 是自增可以不用传值
  2. name = 'musibii'
  3. pwd = '123'
  4. UserInfo.objects.create(name=name, pwd=pwd)

  1. # 比如 id 为1,想要删除一个数据首先需要根据 id 获取数据
  2. UserInfo.objects.filter(id=1).delete()

查一个

  1. ret = UserInfo.object.filter(id=1).first()
  2. print(ret)

查多个

  1. ret = UserInfo.objects.all()

  1. name = 'maffia'
  2. pwd = 'abc'
  3. ret = UserInfo.objects.filter(id=1).update(name=name, pwd=pwd)

Django 系列博客(四)的更多相关文章

  1. Django 系列博客(十四)

    Django 系列博客(十四) 前言 本篇博客介绍在 html 中使用 ajax 与后台进行数据交互. 什么是 ajax ajax(Asynchronous Javascript And XML)翻译 ...

  2. Django 系列博客(一)

    Django 系列博客(一) 前言 学习了 python 这么久,终于到了Django 框架.这可以说是 python 名气最大的web 框架了,那么从今天开始会开始从 Django框架的安装到使用一 ...

  3. Django 系列博客(十六)

    Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...

  4. Django 系列博客(十三)

    Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...

  5. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

  6. Django 系列博客(十一)

    Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...

  7. Django 系列博客(十)

    Django 系列博客(十) 前言 本篇博客介绍在 Django 中如何对数据库进行增删查改,主要为对单表进行操作. ORM简介 查询数据层次图解:如果操作 mysql,ORM 是在 pymysql ...

  8. Django 系列博客(九)

    Django 系列博客(九) 前言 本篇博客介绍 Django 模板的导入与继承以及导入导入静态文件的几种方式. 模板导入 模板导入 语法:``{% include '模板名称' %} 如下: < ...

  9. Django 系列博客(八)

    Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...

随机推荐

  1. Codeforces Codeforces Round #484 (Div. 2) E. Billiard

    Codeforces Codeforces Round #484 (Div. 2) E. Billiard 题目连接: http://codeforces.com/contest/982/proble ...

  2. Forward团队-爬虫豆瓣top250项目-开发文档

    项目地址:https://github.com/xyhcq/top250 我在本次项目中负责写爬虫中对数据分析的一部分,根据马壮分析过的html,我来进一步写代码获取数据,具体的功能及实现方法我已经写 ...

  3. html或者jsp页面刷新问题

    setTimeout(function(){window.location.reload();//刷新当前页面.},2000) window.location.reload();//刷新当前页面.pa ...

  4. JAVA RSA非对称加密详解[转载]

    一.概述1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现2.java6支持RSA算法3.RSA算法可以用于数据加密和数字签名4.RSA算法相对于DES/AES等对称加密算 ...

  5. PMP:11.项目采购管理

    项目采购管理包括从项目团队外部采购或获取所需产品.服务或成果的各个过程.  项目采购管理包括编制和管理协议所需的管理和控制过程,例如,合同.订购单.协议备忘录 (MOA),或服务水平协议 (SLA). ...

  6. Python小练习之寻找101到200之间的素数

    方法1:from math import * def primeNumber(start,end): num = 0 for i in range(start,end): flag = 0 for j ...

  7. Linux下MySQL数据库的安装

    记录详细过程以备使用 1.创建群组及用户 obd:~ # groupadd mysql obd:~ # useradd -g mysql mysql 2.创建相关目录 obd:~ # mkdir -p ...

  8. 大叔学ML第二:线性回归

    目录 基本形式 求解参数\(\vec\theta\) 梯度下降法 正规方程导法 调用函数库 基本形式 线性回归非常直观简洁,是一种常用的回归模型,大叔总结如下: 设有样本\(X\)形如: \[\beg ...

  9. 【洛谷4172】 [WC2006]水管局长(LCT)

    传送门 洛谷 BZOJ Solution 如果不需要动态的话,那就是一个裸的最小生成树上的最大边权对吧. 现在动态了的话,把这个过程反着来,就是加边对吧. 现在问题变成了怎么动态维护加边的最小生成树, ...

  10. 封装一个简易版的ajax操作对象

    /** * 发送ajax请求 * @type {Object} * 使用方法如下: * $ajax.request( * method: "post", //请求方式 * url: ...