Django 系列博客(四)

时间:2022-12-15 18:34:49

Django 系列博客(四)

前言

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

ORM简介

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

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

from django.db import models

# Create your models here.

class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)

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

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

数据返回

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

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

Django 系列博客(四)

该函数有五个参数:

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

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

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

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

Django 系列博客(四)

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

Django 系列博客(四)

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

查看源码:

Django 系列博客(四)

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

Django 系列博客(四)

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

  1. HttpResponse:返回字符串。

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

ORM 连接数据库

ORM 连接 sqlite3

  1. 配置 settings 文件

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

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

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

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

  1. 在 models 中创建类和字段
from django.db import models

# Create your models here.

class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
  1. 把表同步到数据库(因为 orm 不能创建表,所以需要手动创建一个对应的数据库)。创建完成后在项目根目录下运行两条命令。

    • python3 manage.py makemigrations

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

    # -*- coding: utf-8 -*-
    # Generated by Django 1.11.9 on 2019-01-07 06:59
    from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [
    ] operations = [
    migrations.CreateModel(
    name='UserInfo',
    fields=[
    ('id', models.AutoField(primary_key=True, serialize=False)),
    ('name', models.CharField(max_length=32)),
    ('pwd', models.CharField(max_length=32)),
    ],
    ),
    ]

    Django 系列博客(四)

    • python3 manage.py migrate

    将数据表同步到数据库中

    Django 系列博客(四)

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

Django 系列博客(四)

这些表都是什么意思呢?

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

ORM 连接Mysql

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

  1. 配置 settings 文件

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

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_03',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'password'
}
}

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

Django 系列博客(四)

连接成功会显示 successful。

  1. 配置 app 下的 init 文件,不要写错地方了
import pymysql

pymysql.install_as_MySQLdb()
  1. 在 models 中创建类和字段

和 sqlite3的一样,

from django.db import models

# Create your models here.

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

使用 orm 进行增删查改

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

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

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

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

查一个

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

查多个

ret = UserInfo.objects.all()

name = 'maffia'
pwd = 'abc'
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 '模板名称' %} 如下: &lt ...

  9. Django 系列博客(八)

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

随机推荐

  1. android Dialog重绘

    String title = ""; if(itemInfo!=null) title = "\n\""+itemInfo.itemSSID+&quo ...

  2. html5跨域通讯之postMessage的用法

    转自:http://www.cnblogs.com/wshiqtb/p/3171199.html postMessagePortal.html 页面代码 <!DOCTYPE html> & ...

  3. Divide Two Integers leetcode

    题目:Divide Two Integers Divide two integers without using multiplication, division and mod operator. ...

  4. Delphi中自画TStatusBar面板中的文字颜色背景以及图片

    转自 http://www.delphitop.com/html/kongjian/351.html 首先定义:procedure TStatusForm.FormCreate(Sender: TOb ...

  5. lightoj 1036 dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1036 #include <cstdio> #include <cst ...

  6. oracle 表导入到powerDesigner 中

    最近不忙,之前一直是用powerDesigner看表结构,还没自己导入过,今天试试 oracle 表导入到powerDesigner 中步骤: 1.File--->reverse Enginne ...

  7. 最小生成树(kruskal算法)

    首先明确三个概念: 1.最小生成树的特点? 答:假设某个连通网络由n个顶点组成,则其生成树必含n个顶点和n-1条边,而最小生成树的n-1条有个要求:总和最小. 2.并查集的运用? 答:在该问题中,首先 ...

  8. c&sol;c&plus;&plus; 求一个整数转换为二进制数时中&OpenCurlyQuote;1’的个数

    求一个正整数转换为二进制数时中‘1’的个数 分析:这道题目就是很简单的位运算,我们可以把这个整数和1进行&操作(就是二进制数中的最低位与1进行&),然后将这个整数进行右移处理,将下个位 ...

  9. 交换路由中期测验20181205(DHCP、IOS、静态路由、RIP、EIGRP)

    测试拓扑: 知识点:DHCP:IOS的备份恢复与更新:静态路由:动态路由(RIP):动态路由(EIGRP) 1.DHCP 拓扑: 主要指令: ip dhcp pool 地址池名称   network ...

  10. js类型----你所不知道的JavaScript系列(5)

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...