百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Django从入门到精通系列-Django数据模型

toyiye 2024-09-19 04:52 2 浏览 0 评论

数据库

数据库是软件开发中的重点,在本课程中我们使用MySQL这个主流的关系型数据为例,当然有时候也会使用SQLLite这个Django默认支持的关系型数据库的。

关于数据库学习,我在之前的课程中已经给大家都讲解过了,这里就是简单的回忆一下一些常见的CRUD操作。

当前我们使用的sql标准主要是sql92和sql98,在这个标准之下,sql分为三大类:

  • ddl

show、create、drop

  • dml

insert update、delete、select

  • dcl

invoke、grant

创建数据库的命令:

create database dbName [default charset=’utf8’]

创建表的命令:

create table tableName(

字段1 类型 约束条件,

字段2 类型 约束条件,

……

字段n 类型 约束条件 #注意,最后一个没有逗号

)

如:

# 创建一个存储数据的二维表

create table t_user (

id int auto_increment primary key comment '自动增长的主键',

username varchar(50) not null comment '账号',

password varchar(50) not null comment '密码',

regist_time datetime default now() comment '注册时间'

)

删除数据库或者表:

drop table|database TName|dbName

CRUD操作:

-- 全字段增加数据

insert into [tb_name] values(v1, v2, .. vn)


-- 指定字段增加数据

insert into [tb_name](col1, col2, col3) values(v1, v2, v3)

-- 修改数据

update [tb_name] set col1 = v1, col2 = v2, .. where [condition]


# 删除数据

delete from [tb_name] where [condition]


#查询数据

select * from [tb_name] where [condition]

ORM 概述

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

Django 是一种实现了 MVT 处理模式的 web 框架,MVT 处理模式是从 MVC 处理模式上发展衍生出来的,在 MVC 处理模式中,数据处理部分作为核心,向前和视图页面进行交互,向后和数据库进行交互。

MVC 处理模式下,将程序中的对象数据永久地存储在数据库中的操作称为数据持久化的操 作,专门进行数据持久化的各种操作方式被抽象成了一种特殊的编程模型:ORM。

由于各种类型的 web 项目中,都会涉及到和数据库之间的交互 Django为了极大程度地简化开发,将ORM 操作完整地封装起来提供接口函数方便开发人员进行操作。

数据库同步

Django 项目连接 mysql 数据库

Django 项目要操作数据库,首先要和数据库建立连接,才能让程序中的数据和数据库关联起来进行数据的增删改查操作。

注意:Django支持当前大多数数据库的使用,本课程中使用MySQL数据库为例讲解。

Django项目默认使用mysqldb模块进行和mysql数据库之间的交互操作,但是mysqldb 模块对于 python3.4 以上的版本支持还不够完善,所以我们要使用替代方案,通过 pymysql 模块完成和数据库之间的交互过程。

Django 连接 mysql 数据库的操作,是通过根模块的配置实现的,在项目根模块的配置文件 settings.py 中,我们可以查询到如下默认配置:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

}

}

DATABASES 配置:用于进行数据库连接信息的配置:

ENGINE:用于特定的数据库引擎的配置,一般选项如下:

  • 'django.db.backends.postgresql'
  • 'django.db.backends.mysql'
  • 'django.db.backends.sqlite3'
  • 'django.db.backends.oracle'

NAME:要连接的数据库名称的配置

USER:配置连接数据库的用户账号

PASSWORD:配置连接数据库的登录密码

HOST:配置数据库所在的主机 IP 地址

PORT:配置连接数据库的端口号

CHARSET:配置连接数据库交互数据编码格

如果我们使用Django默认的数据库SQLLite,则不需要修改配置项,如果需要使用MySQL,则配置信息如下:

# 引入需要的模块

import pymysql

# 转换数据库支持

pymysql.install_as_MySQLdb()


DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'db_test_django',

'HOST': '', #为空表示使用本机,也可以写成localhost或者一个ip地址

'PORT': 3306,

'USER': 'root',

'PASSWORD': 'root',

'CHARSET': 'utf8'

}

}

如此,Django和数据库之间的连接关系就建立了。

定义创建模型

在 Django 项目中定义模型数据,其实就是定义 class 类型,通过类型创建的对象来封装和管理数据,一定要在这里明确关联和对应关系。

程序

数据库

class类型

table表格

attribute属性

field字段

object对象

record记录或者行


有了对应关系之后,我们要创建的模型对象的属性必须和数据库中的字段类型对应起来。

对象中的属性类型定义

表中的字段类型

AutoField()

auto_increment 自动增长,一般主键

BooleanField()

bool 布尔类型

NullBooleanField()

bool or null 扩展布尔类型

CharField()

varchar 字符串

TextField()

text 长文本

IntegerField()

int 整数

DecimalField()

double 高精度浮点数

FloatField()

float 单精度浮点数

DateField()

date 日期

TimeField()

time 时间

DateTimeField()

datetime 日期时间

FileField()

blob 二进制

ImageField()

blob 二进制


每个字段定义时,都会有自己的一些特殊的选项指定:

选项

描述

null

如果为 True,将 NULL 空值存储到数据库中,默认 False

blank

如果为 True,表示该字段允许存储空值,默认 False

db_column

字段名称,如果不指定,直接使用类型属性的名称作为字段名称

db_index

如果设置为 True,表示给当前字段添加索引支持

default

给字段设置默认值

primary_key

是否设置当前字段为主键

unique

如果为 True,该字段中存储的值必须是唯一的


在大部分项目中,还会涉及到多表关联操作:

选项

描述

ForeignKey

一对多关联关系,该字段定义在多的一方

ManyToManyField

多对多关联关系,该字段两方都需要定义

OneToOneField

一对一关联关系,该字段可以定义在任意一方

在blog模块下的models.py文件中创建对应的类:

# 需要导入的模块,必不可少
from django.db import models


# 用户类
# Django中的数据模型必须继承Model类
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
nickname = models.CharField(max_length=255, null=True, blank=True)
age = models.IntegerField()

# 文章类
class Article(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=255)
content = models.TextField()
# 外键,这个作者对象就是User类对应的外键
author = models.ForeignKey(User)

数据库同步操作

创建好我们需要的模型类之后,需要将创建好的类型添加到数据库中并同时建立关联关系。

根据模型类自动生成对应数据库引擎的sql 语句

在 settings.py 中,连接数据库信息中配置了数据库引擎,其实就是已经告诉 Django 我们使用的是哪个数据库了,Django会根据指定的数据库自动生成对应sql 语句。执行如下的命令:

python manage.py makemigrations

查看生成的sql语句

通过命令自动生成 sql 语句之后是存储在文件中的,我们可以通过命令的方式直接查看生成的 sql 语句:

# 执行命令,查看生成的 sql 语句

python manage.py sqlmigrate [app_name] [no]

自动同步到数据库

既然 Django 可以自动生成 sql 语句,当然可以自动同步到数据库中,并不需要开发人员再去手工创建各种数据表了:

python manage.py migrate

此时,再查看你的数据库,如果上面的命令都没有报错,则会发现我们定义的模型对应的表已经创建出来了。

模型操作——增删改查

Django 中对创建好的对象数据的操作,主要有增删改查四种操作方式进行处理,也就是数据模型操作,Django为大家提供了如下几种操作方式:

  • 类方法操作方式(了解)
  • 类管理器操作方式(重要——面向对象的操作方式)
  • 对象属性的操作方式(重要——面向过程的操作方式)

我们下面都一一来看看这三种操作方式吧,因为增删改查四种操作方式增删改操作相对比较单纯,查询操作比较复杂。增加直接调用Model类中的save方法,删除则调用delete方法,下面我们先以增删为例给大家讲解。

类方法操作方式(了解)

修改模型定义类,创建一个静态的对象创建方法。

class User(models.Model):

    id = models.AutoField(primary_key=True)

    name = models.CharField(max_length=50)

    nickname = models.CharField(max_length=255, null=True, blank=True)

    age = models.IntegerField()

  

    # 实现一个简单的类方法,完成增加操作

    @classmethod

    def create(cls, name, nickname, age):

        user = cls(name=name, nickname=nickname, age=age)

        return user

重新定义 views.py 中的处理函数:

# 注册方法

  def register(request):

   user = models.User.create("liujianhong","刘建宏",16)

   # 因为User类继承了Model类,所以有个save保存对象

   user.save()

   return HttpResponse("<h1>用户注册成功!!</h1>")

配置路由,完成之后启动项目:

urlpatterns = [

   url(r"^index/#34;,views.index,name="index"),

   url(r"^register/#34;,views.register,name="register"),

  ]

通过地址访问这个路由函数,查看数据库,发现用户已经注册成功了!!

类管理器操作方式

通过使用 Django 提供的对象管理器 Manager,给每个模型类创建一个管理类如作者类型 User 的数据管理类为 User Manager,这也是符合面向对象开发思想的一种开发方式,不同的类型负责不同的功能,互相协作完成整个功能。

在models.py文件中创建一个类型,这个是对应model模型类的管理器类型,如User类的管理器UserManager:

# 用户类管理器

  class UserManger(models.Manager):

  

    def add(self,name,nickname,age):

        # 调用Manger类的create方法

        user = self.create(name=name, nickname=nickname, age=age)

        return user

  

  # 用户类

# Django中的数据模型必须继承Model类

  class User(models.Model):

    id = models.AutoField(primary_key=True)

    name = models.CharField(max_length=50)

    nickname = models.CharField(max_length=255, null=True, blank=True)

    age = models.IntegerField(default=18)

  

    # 用户管理器对象

    user_manger = UserManger()

之后在view.py视图函数中直接调用User对象的user_manger对象的add方法完成即可。

def register(request):

  

    # 第二种方式,类管理器方式

    user = models.User.user_manger.add("liushuaige","刘帅哥",16)

    print(user)

  

    return HttpResponse("<h1>用户注册成功!!</h1>")

运行代码,查看数据库:

第二种方式是基于面向对象的方式完成,为每一个model模型类构建一个管理器对象,这种方式更符合面向对象的编程,就是将对自身的各种操作(增删改查),交给一个管理器完成,model模型类只是定义属性即可,而自身不会参与操作,推荐使用

对象属性操作方式

实质我们的model类已经继承了Model这个类,根据第一个种方式,我们知道Model类中存在一个save方法,所以我们也可以直接构建对象,使用这个方法完成操作。

model.py不需要任何的操作,只在views.py文件中构建对象,完成保存即可。

def register(request):

    

    # 第三种方式,直接构建对象,调用save方法

    # 因为我们的User类继承了Model类,所以有save,直接调用即可

    # 实质第三种也是第一种的简单写法罢了

    user = models.User(name="liuouba", nickname="刘欧巴", age=16)

    user.save()

  

    return HttpResponse("<h1>用户注册成功!!</h1>")

查询操作

查询数据的操作一般都是数据操作中比较复杂的一部分,针对不同的操作方式进行分类讲解,为了方便进行快速的操作,我们通过Django提供的一个shell测试命令行进行处理

进入项目主目录文件夹,运行如下命令进入项目测试命令行:

python manager.py shell

此时就进入了shell环境,我们要进行各种操作即可:

这样就增加了一条数据,如果要删除,则调用删除方法。

删除数据了。

查询多条数据

  • all()查询全部数据
  • filter([condition])查询指定条件数据,如果没有指定条件,等同于all()
  • exclude([condition])查询指定条件之外的数据,如果没有指定条件,等同于all()
  • order_by()根据指定的字段进行排序查询,字段前面添加符号'-'表示倒序
  • values()将查询到的数据转换成字典,保存在列表中返回

all方法返回所有数据,相当于查询所有数据。注意返回的是一个QuerySet的查询集合,如果需要取值,则需要通过下标索引查找。

filter方法获取符合条件的QuerySet,如下操作:

exclude方法查找条件不符合的,和filter方法正好相反。

order_by()方法根据传递的属性名称进行排序,如果属性前加一个-(负号),则表示倒序排列,否则正序排列。

values()将查询到的数据转换成字典,保存在列表中

查询1条数据

  • get([condition])查询指定条件的数据,返回0条或者多条都会出现异常
  • count()返回查询到的结果的总数
  • first()返回查询到的第一条数据
  • last()返回查询到的最后一条数据
  • exists()判断查询结果中是否包含数据

注意get方法和filter方法的区别,主要有两点区别:

1、 get获取的是一个对象,而filter获取的是一个列表

2、 get如果获取不到值(没有条件符合),则报错,而filter会返回一个空列表

count方法,返回符合条件的数量。

first和last方法,返回符合条件的第一条和最后一条。

exists方法,判断符合条件的数据是否存在。

条件查询(filter,exclude)

  • 相等条件查询 key=value
  • 包含条件查询 key__contains=value:模糊查询like
  • 开头结尾查询 key__startswith=value key__endswith=value
  • 是否为空查询 key__isnull=True
  • 范围查询 key__in=[1,2,3,4,5,6,7]
  • 关系查询

key__gt=1 大于1 grant than

key__gte=1 大于等于1 grant than or equals

key__lt=1 小于1

key__lte=1 小于等于1

  • 日期查询[year/month/day/week_day/hour/minute/second]

n key__year=2017

多条件查询

上述都是单条件查询,如果我们有多个条件需要查询呢?如果条件之间的关系是并且的关系,则可以使用filter进行多次过滤或者或者在一个filter中通过逗号间隔多个提交。

但是如果是或者的关系呢?Django为我们提供了一个比较好用的Q,完成多条件的查询,使用Q对象,首先需要引入Q对象。

我们看到,有了Q对象后,我们就可以多条件的查询了,不管是并且、或者、非的逻辑都可以完成了。这个就是查询对象Q。

查询原值对象F。

在开发中,我们有时候需要将一些原有的数据可能就行操作,如年龄加一,那么这个操作如果完成呢?

我们看到,如果使用传统的手段,我们需要先查询出这个对象,之后在对该对象的age加一,之后在保存这个对象,完成数据的更新,比较麻烦。

Django针对这种情况,为大家设计了一个F对象,这个对象可以很快的查询出原有对象的值,那么如上操作就变成了一条语句了。

返回的1表示有一条数据被更新了。F对象在我们进行Django数据查询的时候,能够辅助我们快速取到对象原有的值,方便我们进行各种操作。所以F对象是原有值对象。

初识后台管理模块

Django 提供了默认的后台管理操作模块,以网站的形式提供网站中数据的管理操作,使我们可以快速完成后台的管理,通过如下的步骤启用后台管理模块。

要使用后台管理模块,首先需要创建一个超级管理员:

python manage.py createsuperuser

按照提示,输入用户名称、邮箱、密码,之后启动项目。

如果需要中文显示,请修改setting文件:

LANGUAGE_CODE= "zh-Hans"

注册模块到后台管理系统中,在子模块的admin.py文件中:

from django.contrib import admin

from . import models

admin.site.register(models.User)
admin.site.register(models.Article)

使用如下地址完成后台的访问:

http://localhost:8000/admin/

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码