作为一个顶级网站后端框架,Django展示出了其特有的能力。我们知道,一个应用,无论是App还是网站,一个很重要的功能就是要与数据库进行交互。在Django这里,它给我们提供了便利。通常我们要操作数据库,都是用sql语句,来对数据库进行增删改查。这使得开发者不仅要学习高级语言,还要学习sql语句。
现在,我们使用Django作为后端开发框架,我们不需要通过sql语句来操作数据库,而是通过对象。这让开发容易了很多。Django框架能够为我们处理底层的与数据库交互的操作。
接下来,我们就开始吧!
数据库的选择:
Django适合多种常用的数据库,当然对于开发者来说,我们选择使用的是关系型数据库。常用的开源的数据库有 mysql 和 postgresql。
由于MySQL这些数据库安装有点麻烦,我们这里采用的是比较简单的本地数据库SQLite。在本地开发时选择这个,等到项目完成时,转移至服务器时,我们可以将数据库修改了MySQL等,修改时很容易,只需要修改一些配置。例如数据库的地址、用户名、密码等等信息。
所以,在此,我们选择SQLite。
SQLite下载地址,该数据库不需要进行配置,下载解压即可使用。
创建数据库:
在Django项目的setting.py文件中,找到DATABASES,这是对数据库的类型选用。我们使用的是SQLite。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果是其他类型的数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
要生成这个数据库(db.sqlite3),你可以执行下面这个命令。
python manage.py migrate
接着使用SQLiteStudio打开这个数据库。
打开之后,你会发现这里会有一些地动生成的表,这些表是Django框架的一些表,比如Django有一个自己的管理员界面,其中要存管理员信息,就有一个管理员信息表。
数据库已经创建好了,接下来就是要创建表了。创建表之前,你要了解如何去创建一个表,如何去操作一个表(增删改查)。
上面已经说了,在Django的基础上,我们不需要SQL语句,而是通过对象来完成操作。
Django 可以让开发者 通过 类 和 实例的操作 来对应 数据库 表 和记录的操作。
Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。
-
定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类
-
定义该表中的字段(列), 就是定义该类里面的一些属性
-
类的方法就是对该表中数据的处理方法,包括 数据的增删改查
至此,我们就是摆脱了底层的sql语句,转为面向对象的类的定义和方法的结合操作数据库。
这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping)
创建数据库表:
通常在一个系统中,在数据库这块,我们把一些公关数据表单独放到一个app模块中。
那么,我们就使用命令,创建一个app模块来创建数据库公共表。
python manage.py startapp common
前面已经说过,Django是通过定义类来定义数据库表的。
所以,我们要定义数据库的表,无需执行sql语句,只需要在app目录下面 定义特殊的类就可以了。
数据库表的定义,一般是放在app目录中的 models.py里面的。
接着,我们写入一些创建表的代码:
from django.db import models
class Users(models.Model): #定义用户类,用来创建用户信息的表
#用户名称
name = models.CharField(max_length=200)
#用户电话
phone = models.CharField(max_length=100)
#用户住址
addr = models.CharField(max_length=500)
这个 Users 类继承自 django.db.models.Model, 就是用来定义数据库表的。
CharField 对象,对应 varchar类型的数据库字段。后面的参数 max_length 指明了该 varchar字段的 最大长度。
当然除了CharField之外,Django还有许多其他类型,比如:BooleanField、DateField、DateTimeField等等。可查看官方文档
在上面的代码中,我们定义了表的几个字段,接着我们要创建该表。
要创建该表,你就要告诉Django,我们的 common 应用中 需要你关注(也就是让Django判断文件是否被修改), 因为其中包含了 数据库Model的定义。
打开项目中的配置文件settings.py文件,INSTALLED_APPS 配置项 加入如下内容:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'catalog.apps.CatalogConfig',
'common.apps.CommonConfig', #加入此行代码
]
‘common.apps.CommonConfig’ 告诉 Django , CommonConfig 是 common/apps.py 文件中定义的一个应用配置的类。
现在Django知道了我们的 common 应用, 我们可以在项目根目录下执行命令:
python manage.py makemigrations common
common是你创建的公共的数据库的app名称。如果有多个,可以直接在common后面,空格添加。
执行上面命令之后,如下所示。
接着,你去common文件下打开migrations会发现多了一个文件。该文件正是你刚所创建的表。
0001_initial.py文件内容。
# Generated by Django 3.0.3 on 2020-05-19 11:51
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Users',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('phone', models.CharField(max_length=100)),
('addr', models.CharField(max_length=500)),
],
),
]
然后我们要创建该表到数据库中了,执行命令:
python manage.py migrate
打开数据库,就出现了你刚刚所创建的表:
如果你在原来那个表的基础上,增加或者减少了字段,修改之后,继续执行上面两个命令:
1. python manage.py makemigrations common
2. python manage.py migrate
Django框架管理员入口:
Django提供了一个管理员操作界面可以方便的 添加、修改、删除你定义的 model 表数据。
首先,我们需要创建 一个超级管理员账号。
进入到项目的根目录,执行如下命令,依次输入你要创建的管理员的 登录名、email、密码。
python manage.py createsuperuser
注意密码至少8个字符。
创建成功之后,我们在数据库中管理员表中会看到多了一条数据,这里密码是经过加密的。所以说,Django框架自带有数据库安全设置。
然后我们需要修改应用里面的 管理员 配置文件 common/admin.py,注册我们定义的model类。这样Django才会知道,其实这块代码是在我们登录管理员界面之后,会出现我们刚创建的Users表:
from django.contrib import admin
from .models import Users
# Register your models here.
admin.site.register(Users)
然后启动服务,打开管理员界面:
http://127.0.0.1:8000/admin
我们可以点击userss页面,进行添加数据。保存之后,数据将存到数据库中。
不过现在看来,一切操作都有点low,因为管理端界面不是我们自己写的,而是Django框架自带的管理员界面。所以,通常管理员界面需要我们自己再进行开发。
从数据库中获取数据:
获取数据库信息也不是件很难的事情,我们只需要通过简单的对象和方法就可以获取到数据。
首先,我们要有一个路径,去请求获取数据库某个表数据信息。就拿user/ifo路径为例:
如果你不懂Django路由,可参考: Django路由,一篇文章带你彻底了解
当我们访问:http://127.0.0.1:8000/user/ifo/时,就会去获取数据库该表中全部信息。
具体代码该如何写呢?往下看:
我们在user模块下的views.py文件中,写获取数据库信息的代码:
from django.shortcuts import render
from common.models import Users #导入操作数据库表的类
from django.http import HttpResponse
# Create your views here.
def userIfo(request): #当访问user/ifo时执行该函数,发送已给请求
ifo = Users.objects.values() #通过对象操作数据库,获取数据库信息
userifo = ''
for IFO in ifo: #将数据循环出来
for name,value in IFO.items():
userifo += f'{name}:{value}|'
userifo += '<br>'
return HttpResponse(userifo) #返回请求的信息
上面这种方式时获取一个数据库表中的所有数据,那往往我们有时获取部分数据,比如通过某个条件进行筛选。
接下来,我们在通过筛选电话进行获取数据库信息。
接着,我们访问的时候,链接上应该加上参数,这个通常是在前端页面的表单中输入一个值,提交的时候该值作为参数,当然可以有多个参数。
访问链接:http://127.0.0.1:8000/user/ifo/?phone=18569547823
我们只需要在views.py文件中对数据库的查询增加查询条件:
判断请求参数中是否有参数,如果有就就行筛选。
from django.shortcuts import render
from common.models import Users
from django.http import HttpResponse
# Create your views here.
def userIfo(request):
ifo = Users.objects.values()
cs = request.GET.get('phone',None) #判断请求时是否有参数phone,如果有cs就为phone,就执行if语句,如果没有cs就等于None,就不执行if语句
if cs:
ifo = ifo.filter(phone=cs) #filter方法是进行筛选
userifo = ''
for IFO in ifo:
for name,value in IFO.items():
userifo += f'{name}:{value}|'
userifo += '<br>'
return HttpResponse(userifo)
filter方法是一个过滤条件。
有了这个过滤条件,Django 会在底层执行数据库查询的SQL语句 加上相应的 where 从句,进行过滤查询。
下面一篇文章,我们将继续深入Django学习!