Django Demo:简单数据库搭建


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 创建必要的数据库

创建模型

官方示例中创建了两个模型:QuestionsChoice

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,每个字段都有相应的字段类型,如 DateTimeFIeldCharFieldIntegerField。对应的字段名即为 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 将存储在迁移中的修改最终应用到数据库上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值