目录
一、基本介绍
Django 对各种数据库管理系统提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle
- ORM:对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换
- 优点:可以实现不同类型数据库之间无缝切换,不需要改ORM语句
二、初始化设置
2.1 SQLite
- 初始化:默认即为此,无需设置
- 特点:一个文件即为一个数据库(在命令
python manage.py migrate
后产生) - 优点:简单易用,手机app常用此作为软件数据库
- 缺点:处理并发请求性能较低,建议单机测试时用,服务器部署时采用MYSQL
2.2 MYSQL
2.2.1 数据库基础设置
- 创建数据库(两种方法)
- 命令行客户端:进入mysql,输入
create database django_db default charset=utf8; # 防止编码问题,指定为 utf8
- 可视化客户端:右键单击
root@localhost
创建数据库django_db
,指定编码charset=utf8
- 命令行客户端:进入mysql,输入
- 文件settings.py设置
DATABASES = { # 修改默认数据库相关配置 'default': { 'ENGINE': 'django.db.backends.mysql',# 数据库引擎 'NAME': 'django_db', # 数据库名称 'HOST': '127.0.0.1', # 数据库域名,默认可不写 'PORT': 3306, # 数据库端口,默认可不写 'USER': 'root', # 数据库用户名 'PASSWORD': '123456', # 数据库密码(只要不对外开放ip,密码任意) } }
2.2.2 pymysql设置
功能:连接数据库与Django的媒介
- 安装:终端输入命令
pip install pymysql
- 文件__init__.py设置(settings.py同级目录)
import pymysql pymysql.install_as_MySQLdb()
三、数据库操作
3.1 数据库
- 数据库管理系统:MySQL、SQLite等,一个管理系统可以统一管理多个数据库
- 数据库:多个同项目的表组成一个数据库,例如:一个django porject项目就一个数据库
- 表名:User、UserInfo,由
api/models.py
中的class行创建 - 列属性:id、user,列名及列属性由
api/models.py
中的类体创建 - 数据:1、2、jane、smith,由
api/views.py
中语句进行增删改查操作
- 表名:User、UserInfo,由
3.2 api/models.py文件
3.2.1 基本信息
-
文件功能:创建表、设定列属性
-
列写法:
属性=models.字段类型(选项)
-
代码示例
from django.db import models # 默认就有 # 必须继承models.Model,生成表并设表名User class User(models.Model): # 设列名user,字段类型Charfield,参数:最大长度32 user = models.CharField(max_length=32, unique=True) # 表的补充属性填写 class Meta: # 联合唯一索引 unique_together = ('id', 'name') # 排序字段 ordering = ['name'] # 语句:print(User的object对象),会调用此语句,参见3.3.1 def __str__(self): return '%d-%s' % (self.id, self.name)
联合唯一索引:当有多列时,取不少于两列组成联合唯一索引,即 即使其他列不同,联合唯一索引也不可相同
id name age gender 1 sam 12 1 2 duke 13 2 3 jack 12 1 注:如果取age列和gender列为联合唯一索引,则输入jack这行时报错,因为(age,gender)这个元组不可相同
3.2.2 参数说明
-
字段列表
字段类型 说明(含参数) AutoField 自动增长的IntegerField,默认Django会自动创建一个id列作为主键 CharField 字符串,参数max_length表示可容纳最多字符个数,≤255个 TextField 多字符串,无容量限制 IntegerField 整数,建议最小范围原则:
integer_field_ranges = {
‘SmallIntegerField’: (-32768, 32767),
‘IntegerField’: (-2147483648, 2147483647),
‘BigIntegerField’: (-9223372036854775808, 9223372036854775807),
‘PositiveSmallIntegerField’: (0, 32767),
‘PositiveIntegerField’: (0, 2147483647),
}DecimalField 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数 BooleanField 值为True或False DateField 日期,
(1)参数auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False;
(2)参数auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False;
(3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误TimeField 时间,参数同DateField DateTimeField 日期+时间,参数同DateField -
通用参数
参数 可选值 default 设置默认值,字符串注意引号 null 是否可为空,默认False,可为True blank 是否可为空白,默认False,可为True primary_key 是否主键字段,默认值是False,可为True,一般作为AutoField的选项使用 unique 如果为True, 这个字段在表中必须有唯一值,默认值是False
3.3 api/views.py文件
3.3.1 基本信息
- 数据类型
- int类型
- 定义:返回为被影响的行数
- 返回值为此类型函数: 修改update,删除delete
- object类型
- 定义:表中每一行即为一个object类型
- 返回值为此类型函数:查询first、last,创建create
- QuerySet类型
- 定义:表中多行即为QuerySet类型,类似含有多个object类型数据的列表
- 返回值为此类型函数:查询all,filter
- int类型
- 取值方法
- 已知QuerySet求object:若a为QuerySet,a[0]为object
- 已知object求列值:若a为User表的object对象,则user值为a.user
3.3.2 实操示例代码
-
postman中请求
-
api应用中views.py(CBV写法)
from django.shortcuts import HttpResponse, redirect from django.views import View from api import models class Index(View): def get(self, request): return HttpResponse('GET处理结束') def post(self, request): # 获取请求体中的数据项 user_a = request.POST.get('user_a') print('请求中user_a为:', user_a) user_b = request.POST.get('user_b') print('请求中user_b为:', user_b) # 数据库的增操作 models.User.objects.create(id=1, user=user_a) models.User.objects.create(pk=2, user=user_b) # 主键,此处pk和id一样 # 数据库的查询操作 user_1 = models.User.objects.first().user print('查找数据库首行的用户项为:', user_1) user_2 = models.User.objects.filter(id=2).first().user print('查找数据库id=2行的用户项为:', user_2) # 数据库的改操作 num = models.User.objects.filter(id=1).update(user='sam') # update只能修改queryset数据类型 print('筛选式修改操作所影响到的行数为:', num) user_3 = models.User.objects.first().user # 查询修改操作后的数据项 print('修改操作后数据库首行的用户项为:', user_3) # 数据库的删操作 res = models.User.objects.first().delete() # delete方法可接收object对象或queryset对象 #res的值元组:(1, {'api.User': 1}),前后两个1都代表影响到的行数 user_4 = models.User.objects.first().user print('删除操作后数据库首行的用户项为:', user_4) # 格式化数据库内数据的操作 models.User.objects.all().delete() print('数据库清空') return HttpResponse('POST处理结束')
-
输出结果
四、数据库可视化
4.1 各文件布局
- 模型文件api/models.py
from django.db import models from datetime import datetime class Stu(models.Model): birthday = models.DateField() height = models.DecimalField(max_digits=4, decimal_places=1) gender = models.IntegerField()
记得第一时间做数据库迁移:migrate
- 管理模块api/admin.py
from django.contrib import admin from .models import Stu class StuPostAdmin(admin.ModelAdmin): # 数组变量名是固定的:记录名称,不写不展示 list_display = ["birthday", "height", "gender"] # 在管理界面注册数据库和admin模型组件 admin.site.register(Stu, StuPostAdmin)
- 路由配置main/urls.py
... from django.urls import path # admin数据库管理 from django.contrib import admin urlpatterns = [ path('admin/', admin.site.urls) ] ...
4.2 账号及登录
- 创建超级用户:
python manage.py createsuperuser
- 登录页面:http://127.0.0.1:8000/admin
- 弹出登录页面
4.3 展示效果
- 数据库列表
- 数据库记录编辑
跳转至总篇目录