Django项目-数据库,模型创建
来源:互联网 发布:linux系统zip命令 编辑:程序博客网 时间:2024/05/19 10:38
我们将设置数据库,创建您的第一个模型,并介绍
数据库设置
现在 , 使用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 modelsclass 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, sessionsRunning 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项目-数据库,模型创建
- [Django数据库模型]创建我们第一个Django模型
- 创建 Django 博客的数据库模型
- Django项目实践(二)数据库配置和模型的创建
- [Django数据库模型]创建一个简易的Django APP
- Django项目实践3 - Django模型(view-数据库)
- Django项目实践3 - Django模型(字段、数据库操作及模型继承)
- Django模型--数据库操作
- Django-模型(数据库)
- Django 模型(数据库)
- django 数据库模型映射
- Django 数据库模型配置
- Django模型(数据库)
- Django 模型(数据库):
- Django应用-第1章 创建项目、应用、数据库
- 使用django创建项目
- 创建django项目
- 创建Django项目
- VSCode+golang 安装配置
- MongoDB 搭建 Windows
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)-C:小明打联盟(DP+思维)
- 【机器学习】Sklearn特征工程构建与优化
- Maven的安装和配置(Windows)
- Django项目-数据库,模型创建
- Dubbo第一章:Dubbo-admin编译和Dubbo简单入门
- java、javascript、js、jsp的区别
- elasticsearch-索引性能优化技巧
- BZOJ1562: [NOI2009]变换序列(匈牙利算法,字典序相关)
- CF 155C. Hometask 思维+模拟.
- [ubuntu]安装配置jdk和eclipse新建 工程
- Oracle truncate、 delete、 drop区别
- [work]tensorflow Windows 安装