您的位置:首页 > 数据库

Django项目-数据库,模型创建

2017-12-10 17:48 507 查看
我们将设置数据库,创建您的第一个模型,并介绍 Django 快速自动生成的管理站点。

数据库设置

现在 , 使用dsite/settings.py

这是一个正常的Python模块,模块级变量代表Django设置。

默认情况下,配置使用SQLite。

如果你是数据库新手,或者你只是想尝试Django,这是最简单的选择。

SQLite包含在Python中,所以你不需要安装任何东西来支持你的数据库。

但是,当开始你的第一个真正的项目时,你可能想要使用一个更可扩展的数据库

比如PostgreSQL,以避免数据库切换的麻烦。

如果您希望使用其他数据库,请安装相应的数据库绑定,并在项目中更改为以下键中所对应的模块 以匹配数据库连接设置:

ENGINE -
'django.db.backends.sqlite3'
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.oracle'


其他 backends 中的数据库模块也可用。

NAME -


你的数据库的名字 如果使用的是SQLite,则数据库将成为您计算机上的文件;

在这种情况下,NAME 应该是该文件的完整绝对路径,包括文件名。

默认把文件存储在你的项目目录中

os.path.join(BASE_DIR, 'db.sqlite3')


如果你不使用SQLite作为数据库,额外设置

例如 USER,PASSWORD和HOST等必须值。

对于SQLite以外的数据库

如果你使用SQLite之外的数据库,请确保你已经创建了一个数据库。在数据库的交互式提示符下用“ ”来做。CREATE DATABASE database_name;

还要确保提供的数据库用户 dsite/settings.py 具有“创建数据库”权限。

这允许自动创建一个 测试数据库,这将在以后需要。

如果你正在使用SQLite,你不需要事先创建任何东西 - 数据库文件将在需要时自动创建。



在编辑时mysite/settings.py,请设置TIME_ZONE为您的时区。

另外,请注意INSTALLED_APPS文件顶部的设置。

它包含在此Django实例中激活的所有Django应用程序的名称。

应用程序可以在多个项目中使用,您也可以将其打包并分发给其他项目中的其他人使用。

默认情况下,INSTALLED_APPS包含以下应用程序

所有Django都附带了这些应用程序:

django.contrib.admin         - admin管理网站。你会很快使用它。
django.contrib.auth          - 一个认证系统。
django.contrib.contenttypes  - 内容类型的框架。
django.contrib.sessions      - 会话框架。
django.contrib.messages      - 一个消息框架。
django.contrib.staticfiles   - 一个管理静态文件的框架。


但是,这些应用程序至少使用了一个数据库表

所以我们需要在数据库中创建表,然后才能使用它们。

为此,请运行以下命令:

python manage.py migrate


migrate 命令将查看该 INSTALLED_APPS 设置

并根据 dsite/settings.py 文件中的数据库设置以及应用程序随附的数据库设置进行迁移(稍后将介绍这些数据库迁移)

并创建任何必需的数据库表。

您将看到每个迁移所应用的消息。

如果您有兴趣,请为您的数据库运行命令行

type \dt (PostgreSQL),
SHOW TABLES; (MySQL)
.schema (SQLite)
SELECT TABLE_NAME FROM USER_TABLES; (Oracle)


to display the tables Django created.

默认的应用程序包含在常见的情况下,但不是每个人都需要它们。

如果您不需要其中的任何一项或全部,请在migrate根据INSTALLED_APPS运行之前

注释或删除相应的行

该 migrate命令将仅运行INSTALLED_APPS应用程序的迁移 。

创建数据表单models

现在定义数据库中 - 数据库表单 (table),元数据(字段)

原理

一个你的数据模型是与你的实际操作相关。它包含要存储数据的重要字段和行为。 Django遵循DRY原则。目标是在一个地方定义你的数据模型,并从中自动派生出来。

这包括migration - 与Ruby On Rails不同

例如,migrate应用的model文件,本质上只是Django可以滚动更新数据库模式以匹配当前模型 的历史记录。

在我们简单的应用Poll中,我们将创建俩个models:

问题model 和 选择model

一个问题包含一个问题和出版时间,

一个选择有俩个field,choice文本field和投票,每个选择项都和问题有关

这些概念由简单的Python类表示。

polls/models.py 文件代码:

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.CharField(max_length=200)
votes = models.IntegerField(default=0)


代码很简单。

每个model由一个django.db.models.Model类的子类表示。

每个model都有许多类变量,每个变量名表示model中的数据库字段。

每个字段由一个Field类的实例表示
例如

字符字段的CharField和日期时间的DateTimeField。

这告诉Django每个字段包含什么类型的数据。

每个Field实例(例如question_text或pub_date)的名称是机器友好格式的字段名称。

您将在您的Python代码中使用此值,并且您的数据库将使用它作为列名称。

您可以使用可选的第一个位置参数来指定一个可读的名称

如:

pub_date = models.DateTimeField('date published')


这在Django的一些内省部分中被使用,而且它也被用作文档。

如果未提供此字段,则Django将使用机器可读的名称(pub_date)。

在这个例子中,我们只为Question.pub_date定义了一个人类可读的名字。

对于此模型中的所有其他字段,该字段的机器可读名称就足以作为其人类可读的名称。

一些Field类需要参数。

例如:
CharField,要求你给它一个max_length。

这不仅在数据库模式中使用,我们将很快看到在验证中使用

一个字段也可以有各种可选的参数
例:
在这种情况下,我们将投票的默认值设置为0。

votes = models.IntegerField(default=0)


最后,注意使用ForeignKey定义了一个关系

这告诉Django每个Choice都与一个Question相关。

Django支持所有常见的数据库关系:多对一,多对多和一对一。

实现models

将用一小部分model代码给Django提供了很多信息。

有了它,Django能够:

为应用创建数据表

Create a database schema (CREATE TABLE statements) for this app.

创建一个Python数据库访问API 来访问Question和Choice对象。

Create a Python database-access API for accessing Question and Choice objects.

但首先我们需要告诉我们的项目,Polls的应用程序已包含进项目中。

原理
Django应用程序是“可插入的”: 您可以在多个项目中使用一个应用程序, 你可以分发应用程序, 因为它们不必绑定到给定的Django安装。

要将该应用程序包含在我们的项目中,我们需要在INSTALLED_APPS设置中添加对其Config类的引用。

PollsConfig类polls / apps.py文件中,所以它的虚拟路径是“polls.apps.PollsConfig”。

编辑mysite / settings.py文件并将该虚线路径添加到INSTALLED_APPS设置。

代码:

INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]


现在Django知道包含了Polls应用程序。

运行命令,让项目知道该为外部应用polls添加数据表单

python manage.py makemigrations polls


可以看到下面输出(为polls进行数据迁移)

Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice


通过运行 makemigrations,

可以告诉 Django 您已经对models进行了一些更改(在这种情况下,您已经创建了新模型),并且希望将这些更改 存储到数据库中。

Django 运行migration 是如何将更改存储到model(以及数据库模式) ?

这些model只是磁盘上的文件。 如果你喜欢,你可以阅读你的新模型的迁移。

对应文件是 polls / migrations / 0001_initial.py。

不要担心,Django每次创建时都不会读取它们,但是如果您想手动调整Django如何更改model内容,那么它们就是可编辑的。

可以为你运行迁移,并自动管理你的数据库模式 - 这就是所谓的migrate命令

但是首先我们来看看迁移过程将怎样运行SQL。

sqlmigrate命令 通过名称迁移 并返回它们的SQL:

python manage.py sqlmigrate polls 0001


您应该看到类似于以下的内容(为了便于阅读,我们将其重新格式化):

确切的输出将取决于您使用的数据库。下面的例子是为PostgreSQL生成的。

BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL
);
--
-- 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
);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;

COMMIT;


请注意以下几点:

表(table)名称是通过将应用程序的名称(polls)和models中继承model的类的小写名称(question和choice)组合而自动生成的。 (您可以覆盖此行为。)

主键(ID)自动添加。 (你也可以重写这个。) 按照惯例,Django将“_id”附加到外键字段名称。 (是的,你也可以重写这个。)

外键关系通过FOREIGN KEY约束来显式化。不要担心DEFERRABLE部分;这只是告诉PostgreSQL在事务结束之前不执行外键。

它是针对您正在使用的数据库而量身定制的,因此自动为您处理特定于数据库的字段类型

例如 auto_increment(MySQL)serial(PostgreSQL)或 整数主键自动增量(SQLite)

字段名称的引用也是如此

例如使用双引号或单引号。

sqlmigrate 命令实际上并不在数据库上运行迁移 - 它只是将其打印到屏幕上,以便您可以看到SQL (Django认为是必需的)。

这对于检查Django将要做什么

或者如果对有需要通过SQL脚本进行更改的数据库管理员很有用。

如果你有兴趣,你也可以运行python manage.py check;

这将检查您的项目中的任何问题,而无需进行迁移或触摸数据库。

现在,再次运行迁移以在数据库中创建这些模型表:

python manage.py migrate


输出如下:

Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK


migrate命令执行所有尚未应用的迁移

(Django使用名为django_migrations的数据库中的特殊表跟踪哪些应用)

并根据数据库运行它们 - 本质上,将对模型所做的更改与模式同步 在数据库中。

migrate 是非常强大的

随着时间的推移,您可以逐步改变模型,而不需要删除数据库或表

专门用于实时升级数据库,且不会丢失数据。

我们将在本教程的后面部分更深入地介绍migrate,但现在请记住进行模型更改的三步指南:

进行模型更改的三大基本步骤

更改 models (在应用的 models.py 中实现).

运行
python manage.py makemigrations
为这些更改创建migrations,并添加到项目中

运行
python manage.py migrate
按照最终migrations表,将未实现的migrations应用到数据库。

有单独的命令来进行和应用迁移的原因是 :
因为您将提交migration到您的版本控制系统并将它们与您的应用程序一起上线;

它们不仅使您的开发更容易,而且还可以被其他开发人员和生产使用。

阅读django-admin文档以获取有关manage.py实用程序可以执行的操作的完整信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django 数据库 python