操作系统: windows
IDE: Pycharm
后端开发基本都需要操作数据,包括数据的存储、查询、修改、删除。
通常,这些都是通过数据库来完成的。目前业界最广泛使用的数据库还是:关系型数据库。关系型数据库系统,常用的开源数据库有 MySQL 和 postgresql。
Django框架也可以使用sqlite数据库,sqlite没有独立的数据库服务进程,数据操作被做成库直接供应用程序调用。 Django中可以直接使用,无须先搭建数据服务。
Django使用ORM(对象关系映射)来对数据库进行操作,如果要更改系统使用的数据库,例如从sqlite到mysql等其他数据库,只需修改一些配置就可以了。
创建数据库
项目中数据库的配置在 settings.py 中,里面有一个DATABASES代码块:
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3', #BASE_DIR就是项目的根目录
}
}
使用命令创建的项目时,数据库缺省就是使用 sqlite。 而且对于的数据库文件,缺省的文件名是 db.sqlite3 , 就在项目的根目录下面。
如果发现没有数据库文件,执行如下命令:
python manage.py migrate
就会在项目的根目录下面生成一个配置文件中指定的数据库文件 db.sqlite3。
并且会在其中创建一些表,可以用SQLiteStudio查看。
生成的这些表,来自于Django的自带的app,app中的models.py和migrations文件夹下的内容均是和数据库相关的代码文件。
什么是ORM?
Django里面, 数据库表的操作,包括表的定义、表中数据的增删改查,都可以通过 Model
类型的对象进行的。数据库中表定义
和表记录
之间的关系就像类
和类的实例
之间的关系,Django就让开发者通过类
和类的实例
的操作来实现对数据库表和记录的操作。
通常,在Django中定义一张数据库的表就是定义一个继承自 django.db.models.Model
的类。定义该表中的字段(列), 就是定义该类里面的一些属性。类的方法就是对该表中数据的处理方法,包括 数据的增删改查。
这样,开发者对数据库的访问,从原来的使用底层的sql语句,变成面向对象的开发,通过一系列对象的类定义和方法调用就可以操作数据库。
这种通过对象操作数据库的方法 被称之为 ORM(object relational mapping)
使用ORM的优点:
- 极大的简化了应用中的数据库开发,因为无需使用sql语句来操作数据库了, 提高了开发的效率
- 不用再考虑不同的数据库访问的底层细节,基本做到了开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了
定义数据库表:
就是定义继承自models.Model的类。
创建一个common app,用来实现公共的功能。
python manage.py startapp common
数据库表的定义,一般是在app目录中的 models.py里面实现的。
打开 common/models.py,定义一个Costomer类:
from django.db import models
# Create your models here.
#存放数据库表对象
class Costomer(models.Model):
#客户名称
name = models.CharField(max_length=200) #对应数据库中的varchar
#联系电话
phonenumber = models.CharField(max_length=200)
#地址
address = models.CharField(max_length=200)
这个 Customer类继承自 django.db.models.Model
, 就是用来定义数据库表的。
里面的 name
、phonenumber
、address
是该表的3个字段。
定义表中的字段就是定义一些静态属性,这些属性是 django.db.models
里面的各种 Field 对象,对应不同类型的字段。
比如这里的3个字段都是 CharField
对象,对应 varchar
类型的数据库字段。后面的参数 max_length
指明了该 varchar
字段的最大长度。Django有很多字段对象类型, 对应不同的类型的数据库字段。
此时只是完成了表的定义,那如何让Django将定义实现呢?
在setting.py中的INSTALLED_APPS
增加一条:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#增加的是这条
'common.apps.CommonConfig'
]
common.apps.CommonConfig
告诉 Django , CommonConfig
是 common/apps.py 文件中定义的一个应用配置的类。
from django.apps import AppConfig
class CommonConfig(AppConfig):
name = 'common'
CommonConfig
是 AppConfig
的 子类, 就表示这个是应用的配置类。
这里 name = 'common'
, name
是用来定义应用的python模块路径的。这里就是说应用模块路径为 common
。
关于其他的配置参数,可以参考官方文档
现在Django知道了我们的 common 应用, 我们可以在项目根目录下执行命令
python manage.py makemigrations common
得到如下结果:
Migrations for 'common':
common\migrations\0001_initial.py
- Create model Customer
这个命令,告诉Django ,去看看common这个app里面的models.py ,现在已经修改了数据定义, 你现在去产生相应的更新脚本。
执行一下,会发现在 common\migrations 目录下面出现了0001_initial.py, 这个脚本就是相应要进行的数据库操作代码。
然后执行如下命令:
python manage.py migrate
#这里是结果
Operations to perform:
Apply all migrations: admin, auth, common, contenttypes, sessions
Running migrations:
Applying common.0001_initial... OK
现在Django就真正去数据库创建表了。
可以看到commo_costomer表(前面是app名 后面是类名,用_
连接,全部小写)已经被成功创建。
注: 定义表时,如果没有特意设置主键,会自动添加一个id作为表主键
要再添加属性的话,同样是在model.py中进行设置,但要注意加上缺省值,或者允许为空,例如在common表中加一个qq字段:
#null允许没有值 blank允许是空字符串
qq = models.CharField(max_length=20, null=True, blank=True)
以后要更新表的话,就重复以上的操作:
- 在对应app目录下的models.py中修改属性
python manage.py makemigrations XXX
生成对应脚本python manage.py migrate
执行脚本,使数据库同步该修改结果
可以看到字段添加成功
Django Admin 管理数据:
Django提供了一个管理员操作界面,可以方便的添加、删除、修改定义好的model表的数据。Djiango创建的数据库缺省就提供了一个auth_user表,我们可以直接拿来用:
首先,需要创建一个管理员账号:
注: 创建管理员账号不能直接在数据库中进行,因为密码是加密的,在数据库中并非明文存储。
进入到项目的根目录,执行如下命令,依次输入管理员的登录名、email、密码:
python manage.py createsuperuser
效果如下:
注:密码至少8个字符,我设置了12345678
然后我们需要修改app里面的管理员配置文件common/admin.py,注册我们定义的model类。这样Django才会知道,我们就可以在下面的网页上添加信息了
# Register your models here.
from django.contrib import admin
from .models import Customer
admin.site.register(Customer)
好了,现在就可以访问 127.0.0.1:8080/admin/
,输入刚才注册的用户密码登录。
登录后可以看到如下界面。这里面是目前系统中可以修改的表。
点击我们定义的customer
表,进行添加,并按save and add another按钮
可以看到已经成功添加到数据库了:
注:通常不建议直接在数据库中进行添加,添加数据的页面通常也需要自己开发,并不会直接使用Django提供的这个