django入门 直接翻译官方文档
2016-08-10 21:14
295 查看
2.3 写你的第一个django应用, 第一部分.
让我们从一个例子学习.
通过这个教程, 我们会带你领略创建一个基本的投票应用.
它包括2部分:
. 一个公开网站让人们查看投票选项和投票给它们.
. 一个管理网站让你添加, 修改, 删除投票选项.
我们假设你已经安装了django. 你能通过这个命令查看django版本:
$ python -c 'import django; print(django.get_version())';
如果django安装了, 你应该看见版本号, 如果没有, 你会得到错误"没有叫django的模
块".
这个教程是为django1.8和python3.2或更高写的. 如果你在使用python2.7, 你需要对
代码作少量调整, 象注释里说的.
2.3.1 创建一个项目
如果这是你第一次使用django, 你需要注意一些初始设置. 比方说, 你需要 自动-生成
一些确保一个django项目的代码 - 一组对一个django实例的设置, 包括数据库配置,
django定制选项, 应用定制选项.
在命令行, cd 进入你想存放代码的目录, 执行下列命令:
$ django-admin startproject mysite
这会在当前目录创建一个mysite目录.
注意, 你必须避免用python或django内置组件命名项目. 特别的, 这意味着你不能用
django(与django本身冲突) 或 test(与python一个内置包冲突) 命名.
这个代码应该放哪里?
如果你有简单老式php背景(没有使用现代框架), 你可能习惯把代码放在web服务器根
目录(比如/var/www). 使用django, 你不需要这么做. 把这份代码任何部分放在web服
务器根目下不是一个好主意, 因为有被人们通过web查看你的代码的风险, 不安全.
把代码放在根目录以外的一个目录, 比如/root/kk/django_first.
我们看看startproject 创建了什么
mysite/
manage.py
mysite/
__init__.py
urls.py
wsgi.py
这些文件是:
. 外面的mysite根目录仅仅是这个项目的容器, 它的名子不重要, 你可以重命名它
为任何名字.
. manage.py:一个命令行工具, 让你用多用方式与django项目交互.
. 里面的mysite/ 目录是项目的实际python包, 它的名子是你从里面导入任何东西
要用到的, 比如mysite.urls.
: mysite/__init__.py: 一个空文件, 告诉python这个目录应该被当作一个包.
. mysite/settings.py: 设置/配置这个django项目.
. mysite/urls.py: 这个django的URL声明, 你的基于django的网站的内容表.
. mysite/wsgi.py: 一个WSGI兼容web服务器入口.
数据库设置:
现在, 打开mysite/settings.py, 一个用模块级变量表示django设置的普通python模块
.
这个配置默认使用SQLite, 如果你刚学数据库, 或者你只是想试试django, 这是最简单
的选择, python包含了SQLite, 所以你不需要安装别的东西. 但是当开始你的第一个真
正项目, 你可能会用一个更稳健的数据库比如PostgreSQL, 避免可能遇到的数据库切换
问题.
如果你想使用另一种数据库, 安装合适的数据库绑定, 修改DATABASE 'defualt' 项的
下列键:
. ENGINE - 'django.db.backends.sqlite3',
'django.db.backends.postgresql_psycopg2', 'django.db.backends.mysql',
'django.db.backends.oracle' 中的任何一个.
. NAME - 数据库的名字, 如果使用SQLite, 数据库是一个文件, 这种情况下, NAME
应该是绝对路径. 默认值 os.path.join(BASE_DIR, 'db.sqlite3') 会在项目目
录下保存这个文件.
如果用SQLite, USER, PASSWORD, HOST也要被设置.
注意: 如果用postgresql或mysql, 确保你已经创建了数据库.
如果用sqlite, 不需要先创建任何东西, 数据库文件在需要时会被自动创建.
把mysite/settings.py 的TIME_ZONE设置成你的时区.
注意文件上面的INSTALLED_APPS, 它包括了这个django实例里所有被激活的django应用.
应用可以在多个项目里被使用, 你也可以打包, 发布它们给别人在他们的项目里使用.
默认的, INSTALLED_APPS 包括下列应用, 都是django自带的:
. django.contrib.admin 管理站点.
. django.contrib.auth 一个认证系统.
. django.contrib.contenttypes 一个内容类型框架.
. django.contrib.sessions 一个会话框架.
. django.contrib.messages 一个信息框架.
. django.contrib.staticfiles 一个静态文件管理框架.
为了方便通常使用这些应用被默认包括.
其中一些这些应用使用至少一个数据库表, 所以你需要在使用它们前创建这些表. 执行
下列命令来做这个事:
$ python manage.py migrate
migrate命令查找INSTALLED_APPS设置, 创建所有需要的表, 和对应的数据库迁移.
你会看到每个迁移执行的一条信息. 如果你感兴趣, 执行你的数据库命令行客户端, 输
入 \dt(PostgreSQL), SHOW TABLES (MySQL), .schema(SQLite), 或SELECT TABLE_NAME
FROM USER_TABLES(Oracle) 显示django创建的表.
最小需求
如上面所说, 为通常应用情况默认包含的应用, 不一定每个人都需要, 如果你不需要它
们中任何一个, 可以在执行migrate前从INSTALLED_APPS 中注释或删除掉对应行.
开发服务器
让我们测式你的django项目能工作, 进入外面的mysite目录, 执行下列命令:
$ python manage.py runserver
你将看到下列输出:
Performing system checks...
0 errors found
November 17, 2015 - 15:50:53
Django version 1.8, using settings `mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
你已经启动了django开发服务器, 一个纯用python写的轻量级web服务器. 我们用django
包括了它以便你能快速开发, 不需要解决配置生产服务器的问题, 象apache那样, 直到
你为生产作好了准备.
现在是时间注意这个:不要在生产环境使用这个服务器, 它的目地只是开发.(我们的工作
是制作web框架, 不是web服务器.)
现在服务器在运行, 访问 http://127.0.0.1:8000/, 会看见一个页面显示'Welcome to
Django', 淡蓝色粉笔, 它正常工作!
改变端口
默认的, runserver命令从8000端口启动开发服务器, 如果想改变端口, 把端口作为一个
命令行参数传递, 比如这个命令从8080端口启动:
$ python manage.py runserver 8080
如果想改变服务器IP, 把它和端口一起传递, 比如想监听所有公共IP:
$ python manage.py runserver 0.0.0.0:8000
自动重载runserver
开发服务器根据需要为每个请求自动重载python代码, 你不需要为使代码改变生效而重
启服务器, 但是有些动作如添加文件不会触发重启, 这种情况需要手动重启.
2.3.2 创建模块
你在django写的每个应用包含一个跟随一个特定约定的python包. django有一个功能自
动创建应用的目录结构. 使你能专心于写代码.
项目 vs 应用
项目和应用的区别是什么? 一个应用是一个做一些事的web应用, 比如一个Weblog系统,
一个公共记录数据库或者一个简单投票应用. 一个项目是一个特定网站的配置和应用集
合. 一个项目可以包括多个应方用, 一个应用可以在多个项目里.
应用可以在python搜索路径的任何位置. 这个教程里我们在manage.py同一目录创建poll
应用, 这样它能被直接导入为一个顶层模块, 而不是mysite下的一个子模块.
在manage.py同一目录执行下列命令:
$ python manage.py startapp polls
它会创建目录polls :
polls
├── admin.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
在django里写一个数据库web应用第一步是定义模块 - 基本的数据库布局, 额外的元数
据.
哲学
一个模块是单一的, 数据真实性的权威来源. 它包括你的数据的基本的域和行为. django
遵守DRY原则, 目标是在一个地方定义数据模块, 并自动从里面得到东西.
这包括迁移, 不象ruby on rails, 比如, 迁移完全取决于模块文件.
我们创建两个模块Question和Choice.Qustion有一个问下周和公开日期, Choice包括两
部分, 选择文本和投票记录. 每个Choice和一个Question关联.
这些概念可以用简单的python类表示, 编辑polls/models.py:
from django.db import models
# Create your models here.
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);
choice_text = models.CharField(max_length = 200);
votes = models.IntegerField(default = 0);
这段代码很直接, 每个模块由一个类表示, 这些类是django.db.models.Model的子类,
每个模块都有一些变量, 表示一个数据库域.
每个域都被表示成一个Field类实例, CharField 表示字符域, DateTimeField表示日期
域.
每个Field实例的名字是这个域的名字, 以机器友好格式, 数据库把它作为列名.
你可以用一个第一位置参数给Field实例指定一个可读的名字, That's used in a couple
of introspective parts of Django, and it doubles as documentation. 如果这个域
没有提供, Django会使用机器可读的名字. 这个例子里我们只为Question.pub_date 定
义了一个可读的名字.
有的Field类需要参数, 比如CharField, 你需要指定max_length. 它不仅用于数据库模
式, 也用于确认, 我们马上会看到这一点.
一个Field可以有多个参数, 这里我们把votes的默认值设为0.
最后, 注意ForeighKey 定义了一个关系, 它告诉Django每个Choice关联到一个Question,
Django支持所有的数据库关系:多对一, 多对多和一对一.
2.3.3 激活模块
这个小模块给了Django很多信息, 通过它, Django可以:
. 创建数据库模式.
. 创建python数据库房问API以访问Question和Choice对象.
但是我们首先要告诉这个项目polls应用安装了.
Django的应用是"可插拨的", 你可以在多个项目使用同一应用, 你还可以发布应用, 因为
它们不需要与一个特定的Django安装绑定.
编辑mysite/settings.py, 修改INSTALLED_APPS设置使包含'polls':
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)
再执行下列命令:
$python manage.py makemigrations polls
你会看到下列输入:
Migrations for 'polls':
0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
执行makemigration使Django知道你对模块作了些改变(这个例子里, 你添加了些东西)
和你希望这些改变被保存为一个migration.
Django通过Migration 保存你对模块的修改, 它们仅仅是磁盘上的文件, 你可以本看你
新模块的迁移, 它是文件polls/migrations/0001_initial.py.
有一个命令migrate执行迁移并自动管理数据库模式, 我们待会说它, 首先让我们看看
迁移会执行什么SQL语句. 命令sqlmigrate 根据迁移名字反回SQL语句:
$ python manage.py sqlmigrate polls 0001
输出:
BEGIN;
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY
KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
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`);
COMMIT;
注意这些事:
. 实际输出取决于你用的是什么数据库, 这个例子用的是MySQL.
. 表名字通过结合应用名字(polls)和模块名字小写question和choice产生. (你可以
修改这个行为)
. 主键IDs是自动添加的. (你可以修改这个行为)
. 根据约定, Django为外键域名字添加'_id'.(你可以修改这个行为)
. 外键关系通过FOREIGN KEY限制显示指定.
. 你可能通使用不同数据库的情况被仔细考虑到了, 一些特定数据库域类型如
auto_increment(MySQL), serial(PostgreSQL), 或integer primary key
autoincrement(SQLite)被自动处理. 用单引号还是双引号把域名字括起来也被
考虑到了.
. 命令sqlmigrate 不实际在数据库上执行迁移, 它只输出SQL语句.
你可以执行 python manage.py check, 它会检查项目的任何问题, 不会迁移和碰数据库.
现在执行migrate创建这些模块表:
$ python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: admin, contenttypes, polls, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
命令migrate执行所有没有执行的迁移, Django通过一个特殊表django_migrations跟踪
哪些迁移已执行了.
迁移很有用, 让你随时修改模块, 而不需要手动操作数据库, 它专门保持你的数据库最
新, 不会丢失数据.
下面总结修改模块的3步:
. 修改模块models.py.
. 执行 python manage.py makemigrations 创建迁移.
. 执行 python manage.py migrate执行迁移.
把创建迁移和执行迁移分开是因为你可能提交迁移给版本控制系统, 并和应用一起航行
, 这不仅让开发简单, 对其它开发者和在生产中也有用.
2.3.4 使用API
现在我们跳进python交互shell并使用Django的自由API. 用这个命令调用python shell:
$ python manage.py shell
我们不直接输python, 是因为manage.py设置DJANGO_SETTINGS_MODULE环境变量, 告诉
mysite/settings.py python导入路径.
绕过manage.py
如果想不用manage.py, 可以在mysite/settings.py 设置DJANGO_SETTING_MODULE环境变
让我们从一个例子学习.
通过这个教程, 我们会带你领略创建一个基本的投票应用.
它包括2部分:
. 一个公开网站让人们查看投票选项和投票给它们.
. 一个管理网站让你添加, 修改, 删除投票选项.
我们假设你已经安装了django. 你能通过这个命令查看django版本:
$ python -c 'import django; print(django.get_version())';
如果django安装了, 你应该看见版本号, 如果没有, 你会得到错误"没有叫django的模
块".
这个教程是为django1.8和python3.2或更高写的. 如果你在使用python2.7, 你需要对
代码作少量调整, 象注释里说的.
2.3.1 创建一个项目
如果这是你第一次使用django, 你需要注意一些初始设置. 比方说, 你需要 自动-生成
一些确保一个django项目的代码 - 一组对一个django实例的设置, 包括数据库配置,
django定制选项, 应用定制选项.
在命令行, cd 进入你想存放代码的目录, 执行下列命令:
$ django-admin startproject mysite
这会在当前目录创建一个mysite目录.
注意, 你必须避免用python或django内置组件命名项目. 特别的, 这意味着你不能用
django(与django本身冲突) 或 test(与python一个内置包冲突) 命名.
这个代码应该放哪里?
如果你有简单老式php背景(没有使用现代框架), 你可能习惯把代码放在web服务器根
目录(比如/var/www). 使用django, 你不需要这么做. 把这份代码任何部分放在web服
务器根目下不是一个好主意, 因为有被人们通过web查看你的代码的风险, 不安全.
把代码放在根目录以外的一个目录, 比如/root/kk/django_first.
我们看看startproject 创建了什么
mysite/
manage.py
mysite/
__init__.py
urls.py
wsgi.py
这些文件是:
. 外面的mysite根目录仅仅是这个项目的容器, 它的名子不重要, 你可以重命名它
为任何名字.
. manage.py:一个命令行工具, 让你用多用方式与django项目交互.
. 里面的mysite/ 目录是项目的实际python包, 它的名子是你从里面导入任何东西
要用到的, 比如mysite.urls.
: mysite/__init__.py: 一个空文件, 告诉python这个目录应该被当作一个包.
. mysite/settings.py: 设置/配置这个django项目.
. mysite/urls.py: 这个django的URL声明, 你的基于django的网站的内容表.
. mysite/wsgi.py: 一个WSGI兼容web服务器入口.
数据库设置:
现在, 打开mysite/settings.py, 一个用模块级变量表示django设置的普通python模块
.
这个配置默认使用SQLite, 如果你刚学数据库, 或者你只是想试试django, 这是最简单
的选择, python包含了SQLite, 所以你不需要安装别的东西. 但是当开始你的第一个真
正项目, 你可能会用一个更稳健的数据库比如PostgreSQL, 避免可能遇到的数据库切换
问题.
如果你想使用另一种数据库, 安装合适的数据库绑定, 修改DATABASE 'defualt' 项的
下列键:
. ENGINE - 'django.db.backends.sqlite3',
'django.db.backends.postgresql_psycopg2', 'django.db.backends.mysql',
'django.db.backends.oracle' 中的任何一个.
. NAME - 数据库的名字, 如果使用SQLite, 数据库是一个文件, 这种情况下, NAME
应该是绝对路径. 默认值 os.path.join(BASE_DIR, 'db.sqlite3') 会在项目目
录下保存这个文件.
如果用SQLite, USER, PASSWORD, HOST也要被设置.
注意: 如果用postgresql或mysql, 确保你已经创建了数据库.
如果用sqlite, 不需要先创建任何东西, 数据库文件在需要时会被自动创建.
把mysite/settings.py 的TIME_ZONE设置成你的时区.
注意文件上面的INSTALLED_APPS, 它包括了这个django实例里所有被激活的django应用.
应用可以在多个项目里被使用, 你也可以打包, 发布它们给别人在他们的项目里使用.
默认的, INSTALLED_APPS 包括下列应用, 都是django自带的:
. django.contrib.admin 管理站点.
. django.contrib.auth 一个认证系统.
. django.contrib.contenttypes 一个内容类型框架.
. django.contrib.sessions 一个会话框架.
. django.contrib.messages 一个信息框架.
. django.contrib.staticfiles 一个静态文件管理框架.
为了方便通常使用这些应用被默认包括.
其中一些这些应用使用至少一个数据库表, 所以你需要在使用它们前创建这些表. 执行
下列命令来做这个事:
$ python manage.py migrate
migrate命令查找INSTALLED_APPS设置, 创建所有需要的表, 和对应的数据库迁移.
你会看到每个迁移执行的一条信息. 如果你感兴趣, 执行你的数据库命令行客户端, 输
入 \dt(PostgreSQL), SHOW TABLES (MySQL), .schema(SQLite), 或SELECT TABLE_NAME
FROM USER_TABLES(Oracle) 显示django创建的表.
最小需求
如上面所说, 为通常应用情况默认包含的应用, 不一定每个人都需要, 如果你不需要它
们中任何一个, 可以在执行migrate前从INSTALLED_APPS 中注释或删除掉对应行.
开发服务器
让我们测式你的django项目能工作, 进入外面的mysite目录, 执行下列命令:
$ python manage.py runserver
你将看到下列输出:
Performing system checks...
0 errors found
November 17, 2015 - 15:50:53
Django version 1.8, using settings `mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
你已经启动了django开发服务器, 一个纯用python写的轻量级web服务器. 我们用django
包括了它以便你能快速开发, 不需要解决配置生产服务器的问题, 象apache那样, 直到
你为生产作好了准备.
现在是时间注意这个:不要在生产环境使用这个服务器, 它的目地只是开发.(我们的工作
是制作web框架, 不是web服务器.)
现在服务器在运行, 访问 http://127.0.0.1:8000/, 会看见一个页面显示'Welcome to
Django', 淡蓝色粉笔, 它正常工作!
改变端口
默认的, runserver命令从8000端口启动开发服务器, 如果想改变端口, 把端口作为一个
命令行参数传递, 比如这个命令从8080端口启动:
$ python manage.py runserver 8080
如果想改变服务器IP, 把它和端口一起传递, 比如想监听所有公共IP:
$ python manage.py runserver 0.0.0.0:8000
自动重载runserver
开发服务器根据需要为每个请求自动重载python代码, 你不需要为使代码改变生效而重
启服务器, 但是有些动作如添加文件不会触发重启, 这种情况需要手动重启.
2.3.2 创建模块
你在django写的每个应用包含一个跟随一个特定约定的python包. django有一个功能自
动创建应用的目录结构. 使你能专心于写代码.
项目 vs 应用
项目和应用的区别是什么? 一个应用是一个做一些事的web应用, 比如一个Weblog系统,
一个公共记录数据库或者一个简单投票应用. 一个项目是一个特定网站的配置和应用集
合. 一个项目可以包括多个应方用, 一个应用可以在多个项目里.
应用可以在python搜索路径的任何位置. 这个教程里我们在manage.py同一目录创建poll
应用, 这样它能被直接导入为一个顶层模块, 而不是mysite下的一个子模块.
在manage.py同一目录执行下列命令:
$ python manage.py startapp polls
它会创建目录polls :
polls
├── admin.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
在django里写一个数据库web应用第一步是定义模块 - 基本的数据库布局, 额外的元数
据.
哲学
一个模块是单一的, 数据真实性的权威来源. 它包括你的数据的基本的域和行为. django
遵守DRY原则, 目标是在一个地方定义数据模块, 并自动从里面得到东西.
这包括迁移, 不象ruby on rails, 比如, 迁移完全取决于模块文件.
我们创建两个模块Question和Choice.Qustion有一个问下周和公开日期, Choice包括两
部分, 选择文本和投票记录. 每个Choice和一个Question关联.
这些概念可以用简单的python类表示, 编辑polls/models.py:
from django.db import models
# Create your models here.
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);
choice_text = models.CharField(max_length = 200);
votes = models.IntegerField(default = 0);
这段代码很直接, 每个模块由一个类表示, 这些类是django.db.models.Model的子类,
每个模块都有一些变量, 表示一个数据库域.
每个域都被表示成一个Field类实例, CharField 表示字符域, DateTimeField表示日期
域.
每个Field实例的名字是这个域的名字, 以机器友好格式, 数据库把它作为列名.
你可以用一个第一位置参数给Field实例指定一个可读的名字, That's used in a couple
of introspective parts of Django, and it doubles as documentation. 如果这个域
没有提供, Django会使用机器可读的名字. 这个例子里我们只为Question.pub_date 定
义了一个可读的名字.
有的Field类需要参数, 比如CharField, 你需要指定max_length. 它不仅用于数据库模
式, 也用于确认, 我们马上会看到这一点.
一个Field可以有多个参数, 这里我们把votes的默认值设为0.
最后, 注意ForeighKey 定义了一个关系, 它告诉Django每个Choice关联到一个Question,
Django支持所有的数据库关系:多对一, 多对多和一对一.
2.3.3 激活模块
这个小模块给了Django很多信息, 通过它, Django可以:
. 创建数据库模式.
. 创建python数据库房问API以访问Question和Choice对象.
但是我们首先要告诉这个项目polls应用安装了.
Django的应用是"可插拨的", 你可以在多个项目使用同一应用, 你还可以发布应用, 因为
它们不需要与一个特定的Django安装绑定.
编辑mysite/settings.py, 修改INSTALLED_APPS设置使包含'polls':
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)
再执行下列命令:
$python manage.py makemigrations polls
你会看到下列输入:
Migrations for 'polls':
0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
执行makemigration使Django知道你对模块作了些改变(这个例子里, 你添加了些东西)
和你希望这些改变被保存为一个migration.
Django通过Migration 保存你对模块的修改, 它们仅仅是磁盘上的文件, 你可以本看你
新模块的迁移, 它是文件polls/migrations/0001_initial.py.
有一个命令migrate执行迁移并自动管理数据库模式, 我们待会说它, 首先让我们看看
迁移会执行什么SQL语句. 命令sqlmigrate 根据迁移名字反回SQL语句:
$ python manage.py sqlmigrate polls 0001
输出:
BEGIN;
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY
KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
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`);
COMMIT;
注意这些事:
. 实际输出取决于你用的是什么数据库, 这个例子用的是MySQL.
. 表名字通过结合应用名字(polls)和模块名字小写question和choice产生. (你可以
修改这个行为)
. 主键IDs是自动添加的. (你可以修改这个行为)
. 根据约定, Django为外键域名字添加'_id'.(你可以修改这个行为)
. 外键关系通过FOREIGN KEY限制显示指定.
. 你可能通使用不同数据库的情况被仔细考虑到了, 一些特定数据库域类型如
auto_increment(MySQL), serial(PostgreSQL), 或integer primary key
autoincrement(SQLite)被自动处理. 用单引号还是双引号把域名字括起来也被
考虑到了.
. 命令sqlmigrate 不实际在数据库上执行迁移, 它只输出SQL语句.
你可以执行 python manage.py check, 它会检查项目的任何问题, 不会迁移和碰数据库.
现在执行migrate创建这些模块表:
$ python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: admin, contenttypes, polls, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
命令migrate执行所有没有执行的迁移, Django通过一个特殊表django_migrations跟踪
哪些迁移已执行了.
迁移很有用, 让你随时修改模块, 而不需要手动操作数据库, 它专门保持你的数据库最
新, 不会丢失数据.
下面总结修改模块的3步:
. 修改模块models.py.
. 执行 python manage.py makemigrations 创建迁移.
. 执行 python manage.py migrate执行迁移.
把创建迁移和执行迁移分开是因为你可能提交迁移给版本控制系统, 并和应用一起航行
, 这不仅让开发简单, 对其它开发者和在生产中也有用.
2.3.4 使用API
现在我们跳进python交互shell并使用Django的自由API. 用这个命令调用python shell:
$ python manage.py shell
我们不直接输python, 是因为manage.py设置DJANGO_SETTINGS_MODULE环境变量, 告诉
mysite/settings.py python导入路径.
绕过manage.py
如果想不用manage.py, 可以在mysite/settings.py 设置DJANGO_SETTING_MODULE环境变
相关文章推荐
- Hadoop之HBase入门【官方文档翻译】
- django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)
- django 1.8 官方文档翻译: 3-4-1 基于类的视图
- django 1.8 官方文档翻译: 6-6-1 部署 Django
- django 1.8 官方文档翻译: 3-6-2 内建的中间件
- MongoEngine对Django支持的官方文档翻译
- 第一天学英语:django官方文档翻译——目录
- django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
- django 1.8 官方文档翻译: 3-4-2 内建显示视图
- django 1.8 官方文档翻译: 6-4-2 编写自定义的django-admin命令
- django 1.8 官方文档翻译: 2-5-2 进行原始的sql查询
- django 1.8 官方文档翻译: 2-6-3 提供初始数据
- django 1.8 官方文档翻译: 2-1-3 元选项 (初稿)
- django 1.8 官方文档翻译: 3-2-1 内建的视图
- NServiceBus官方文档翻译(二)NServiceBus 入门
- django 1.8 官方文档翻译: 2-1-1 模型语法(初稿)
- django 1.8 官方文档翻译: 2-4-4 编写迁移
- django 1.8 官方文档翻译: 2-6-4 数据库访问优化
- django 1.8 官方文档翻译: 3-1-2 编写视图
- django 1.8 官方文档翻译: 3-1-3 Django 的快捷函数