Django项目-数据库,模型创建
2017-12-10 17:48
507 查看
我们将设置数据库,创建您的第一个模型,并介绍 Django 快速自动生成的管理站点。
这是一个正常的Python模块,模块级变量代表Django设置。
默认情况下,配置使用SQLite。
如果你是数据库新手,或者你只是想尝试Django,这是最简单的选择。
SQLite包含在Python中,所以你不需要安装任何东西来支持你的数据库。
但是,当开始你的第一个真正的项目时,你可能想要使用一个更可扩展的数据库
比如PostgreSQL,以避免数据库切换的麻烦。
如果您希望使用其他数据库,请安装相应的数据库绑定,并在项目中更改为以下键中所对应的模块 以匹配数据库连接设置:
其他 backends 中的数据库模块也可用。
你的数据库的名字 如果使用的是SQLite,则数据库将成为您计算机上的文件;
在这种情况下,NAME 应该是该文件的完整绝对路径,包括文件名。
默认把文件存储在你的项目目录中
如果你不使用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都附带了这些应用程序:
但是,这些应用程序至少使用了一个数据库表
所以我们需要在数据库中创建表,然后才能使用它们。
为此,请运行以下命令:
该migrate 命令将查看该 INSTALLED_APPS 设置
并根据 dsite/settings.py 文件中的数据库设置以及应用程序随附的数据库设置进行迁移(稍后将介绍这些数据库迁移)
并创建任何必需的数据库表。
您将看到每个迁移所应用的消息。
如果您有兴趣,请为您的数据库运行命令行
to display the tables Django created.
默认的应用程序包含在常见的情况下,但不是每个人都需要它们。
如果您不需要其中的任何一项或全部,请在migrate根据INSTALLED_APPS运行之前
注释或删除相应的行
该 migrate命令将仅运行INSTALLED_APPS应用程序的迁移 。
这包括migration - 与Ruby On Rails不同
例如,migrate应用的model文件,本质上只是Django可以滚动更新数据库模式以匹配当前模型 的历史记录。
在我们简单的应用Poll中,我们将创建俩个models:
问题model 和 选择model
一个问题包含一个问题和出版时间,
一个选择有俩个field,choice文本field和投票,每个选择项都和问题有关
这些概念由简单的Python类表示。
polls/models.py 文件代码:
代码很简单。
每个model由一个django.db.models.Model类的子类表示。
每个model都有许多类变量,每个变量名表示model中的数据库字段。
每个字段由一个Field类的实例表示
例如
字符字段的CharField和日期时间的DateTimeField。
这告诉Django每个字段包含什么类型的数据。
每个Field实例(例如question_text或pub_date)的名称是机器友好格式的字段名称。
您将在您的Python代码中使用此值,并且您的数据库将使用它作为列名称。
您可以使用可选的第一个位置参数来指定一个可读的名称。
如:
这在Django的一些内省部分中被使用,而且它也被用作文档。
如果未提供此字段,则Django将使用机器可读的名称(pub_date)。
在这个例子中,我们只为Question.pub_date定义了一个人类可读的名字。
对于此模型中的所有其他字段,该字段的机器可读名称就足以作为其人类可读的名称。
CharField,要求你给它一个max_length。
这不仅在数据库模式中使用,我们将很快看到在验证中使用
一个字段也可以有各种可选的参数
例:
在这种情况下,我们将投票的默认值设置为0。
最后,注意使用ForeignKey定义了一个关系。
这告诉Django每个Choice都与一个Question相关。
有了它,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.
Django应用程序是“可插入的”: 您可以在多个项目中使用一个应用程序, 你可以分发应用程序, 因为它们不必绑定到给定的Django安装。
要将该应用程序包含在我们的项目中,我们需要在INSTALLED_APPS设置中添加对其Config类的引用。
PollsConfig类在polls / apps.py文件中,所以它的虚拟路径是“polls.apps.PollsConfig”。
编辑mysite / settings.py文件并将该虚线路径添加到INSTALLED_APPS设置。
代码:
现在Django知道包含了Polls应用程序。
可以看到下面输出(为polls进行数据迁移)
通过运行 makemigrations,
可以告诉 Django 您已经对models进行了一些更改(在这种情况下,您已经创建了新模型),并且希望将这些更改 存储到数据库中。
对应文件是 polls / migrations / 0001_initial.py。
不要担心,Django每次创建时都不会读取它们,但是如果您想手动调整Django如何更改model内容,那么它们就是可编辑的。
sqlmigrate命令 通过名称迁移 并返回它们的SQL:
您应该看到类似于以下的内容(为了便于阅读,我们将其重新格式化):
确切的输出将取决于您使用的数据库。下面的例子是为PostgreSQL生成的。
请注意以下几点:
表(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;
这将检查您的项目中的任何问题,而无需进行迁移或触摸数据库。
现在,再次运行迁移以在数据库中创建这些模型表:
输出如下:
并根据数据库运行它们 - 本质上,将对模型所做的更改与模式同步 在数据库中。
专门用于实时升级数据库,且不会丢失数据。
我们将在本教程的后面部分更深入地介绍migrate,但现在请记住进行模型更改的三步指南:
运行
运行
有单独的命令来进行和应用迁移的原因是 :
因为您将提交migration到您的版本控制系统并将它们与您的应用程序一起上线;
它们不仅使您的开发更容易,而且还可以被其他开发人员和生产使用。
阅读django-admin文档以获取有关manage.py实用程序可以执行的操作的完整信息。
数据库设置
现在 , 使用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第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
- Django项目实践3 - Django模型(view-数据库)
- Django项目实践3 - Django模型(view-数据库)
- windows创建django项目以及创建数据库的时候提示:No module named blog
- Django项目实践3 - Django模型(字段、数据库操作及模型继承)
- Python Django + Pycharm项目中,项目的创建及数据库连接
- Django初级手册1-项目和应用的创建与简单的数据库操作
- Django 基础(一),项目创建、URL路由、数据库操作、模版
- Django 基础(一),项目创建、URL路由、数据库操作、模版
- Django,数据模型创建之数据库API参考(转载)
- django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面
- django之创建第8-3个项目-数据库数据提取之高级操作
- 3 - 创建 Django 博客的数据库模型
- django之创建第8-2个项目-数据库数据提取之过滤操作符相关
- Django blog - 03 -创建Django博客博客的数据库模型
- Django项目实践3 - Django模型(字段、数据库操作及模型继承)
- 3 - 创建 Django 博客的数据库模型
- django之创建第8个项目-数据库配置及同步研究
- 创建 Django 博客的数据库模型