文章目录
link to official tutorial
Settings.py 配置
在进行 Django 的数据库创建之前,首先需要告诉 Django 我们要创建什么类型的数据库,以及需要创建哪一些表(table),因此第一步需要更改 settings.py
完成相应的配置。
Settings.py DATABASES
首先打开 mysite/settings.py
,在之前的文章中有简单介绍过,这是一个包含了这个Django项目各种配置定义的文件。
数据库默认为 SQLite
,这是一个本地电脑的一个文件。如果你打算使用 Django 给出的数据库以外的数据库,需要安装相应的 bingding
,然后在 settings.py
里面对相面相应的键值对进行修改:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
其中:
ENGINE
:可以是'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', or 'django.db.backends.oracle'
NAME
:数据库的名称。如果使用的是SQLite
,则数据库的名称应为这个SQLite
文件的完整路径,包括文件名在内。默认值如代码所示,在当前的项目目录下
注意,如果不使用
SQLite
,必须额外指定相应的用户名,密码和主机
Settings.py TIME_ZONE
接下来,将 settings.py
中的时区 TIME_ZONE
设置为本地时区,默认新项目为 UTC
:
# 默认值为TIME_ZONE = 'UTC'
TIME_ZONE = 'China/Shanghai'
Settings.py INSTALLED_APPS
这个变量包含此Django项目中所有已经安装并且激活的 app,默认内容包括:
INSTALLED_APPS = [
'django.contrib.admin',# admin site
'django.contrib.auth',# an authentication system
'django.contrib.contenttypes',# a content types framework
'django.contrib.sessions',# a session framework
'django.contrib.messages',# a messaging framework
'django.contrib.staticfiles',# messaging static files
]
上面的部分应用需要使用至少一个数据库表,所以需要在使用前创建对应的表,通过:
python manage.py migrate
这个命令会查看 INSTALLED_APPS
设置的内容,然后根据数据库配置 DATABSES
的配置按照建立需要的表。migrate
即迁移,就是 Django 中用于将 Python 代码中的模型定义等模型更改相关的操作关联到数据库上面,整个过程完全由 Python 代码来实现,从而不需要任何的 SQL
语句就可以实现数据库的基本操作(一些高级操作除外)。
迁移具有下面几个优点:
- 不需要使用
SQL
语言就可以对数据库进行修改 - 从创建好的
model
进行迁移的+2话,不会造成重复现象 - 使用
Django Migration
可以使得当模型发生更改时,每个数据库可以很轻松的和模型保持同步 - 方便版本管理
数据库建立
配置
- 首先,我们需要告诉 Django 我们要使用什么类型的数据库,即对前面介绍的
settings.py
中的DATABASES
变量进行配置 - 修改相应的时区
python manage.py migrate
创建必要的数据库
创建模型
官方示例中创建了两个模型:Questions
和 Choice
:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CHasrField(max_length=200)
votes = models.IntegerField
其中,Questions 包含了两个字段:
question_text
:即这个问题的内容,类型为CharField
,需要指出最大长度值pub_date
:发布时间,类型为DateTime
Chocie 包含了两个字段和一个外键:
question
:这个choice 对应的 question 对象choice_text
:选项的文本,类型为CharField
指定最大长度为200
votes
:投票数据,类型为IntegerField
,默认值为0
可以看到,每个类都继承了 django.db.models.Model
,其中包含了若干个变量,每个变量都对应数据库中的一个字段 field
,每个字段都有相应的字段类型,如 DateTimeFIeld
,CharField
,IntegerField
。对应的字段名即为 Python 代码中的变量名,以及相应的数据库中的列名。
此外,对于每一个字段的构造函数来说,都有一个在第一个位置的可选参数,可以设置一个可读性较好的变量名称,例如在 pub_date
字段的创建中的 'published date'
。此外,字段还可以设置其他各种参数。
ForeignKey
用于告诉 Django 每一个 Choice 对象对应哪一个 Question对象,用于进行关系的定义。Django 中支持的关系类型:
- many-to-many
- many-to-one
- one-to-one
激活模型
通过上面的代码,Django 将会完成下面的操作:
- 为这个应用创建一个数据库的场景,即 SQL 中的
CREATE TABLE...
语句 - 创建一个 Python 数据库访问的 API,用于对 Question 和 Choice 对象进行访问
首先需要将这个应用包含到我们的项目中,即在 settings.py
中的 INSTALLED_APP
中添加这个应用配置对应的引用。例如例子中的 poll
项目,其配置类 PollsConfig
类的路径为 polls.apps.PollsConfig
,因此需要在 settings.py
中添加:
INSTALLED_APPS = [
# new reference
'polls.apps.PollsConfig',
# default reference
...
此时,Django 将会把这个应用包括到这个项目中。然后通过:
python manage.py makemigrations polls
创建这个应用模型 model
对应的迁移 migration
,此时终端中将会出现对应的输出:
Migrations for 'polls':
polls/mmigrations/0001_initial.py
- Create model Question
- Create model Choice
通过创建一个迁移,将 models 的改变存储在迁移中,本质上是一个硬盘中的文件,例如:polls/migrations/0001_initial.py
。Django 将在之后根据这个迁移完成相应的数据库的同步。
此外,还可以通过下面的命令:
python manage.py sqlmigrate polls 0001
可以获取这个迁移对应的SQL语句:
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
具体输出取决于配置的数据库类型,我们可以看到:
- Django 自动将app的名称和model的小写名称通过下划线合并成为对应表的名称(可以自定义命名方法)
- 自动添加主键(也可以自定义)
- 一般Django会在对外键名称自动添加
'_id'
,同样也可以自定义 - 外键关联显示表示为
FOREIGN KEY
这样的约束
接下来,执行 migrate
:
python manage.py migrate
migrate
将会执行所有为完成的迁移,在数据库中创建和模型相对应的表格。所以,最终我们完成model变更的步骤如下:
- 在
models.py
中修改模型 - 执行
python manage.py makemigrations
将模型的修改存储在迁移中 - 通过
python manage.py migrate
将存储在迁移中的修改最终应用到数据库上