Django之第一个app<5>

激活模型

上一篇短小的模型代码告诉Django许多信息。有了它,Django能够做:

  • 为这个应用创建一个数据库模式(CREATE TABLE statements)
  • 创建一个python类型的获取QuestionChoice模型对象的API

但是,首先我们需要告诉工程,polls这个应用被安装了。

注意:Django应用时可插入的,你可以在多个工程中使用一个应用,你可以传播应用,因为它们不必与一个Django安装器绑定。

再次编辑mysite/setting.py 这个文件,改变一个INSTALLEND_APPS这个设置,要包含字符串polls

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
)

现在,Django知道了要包含polls这个app。让我们来运行另一个命令。

$ python manage.py  makemigrations polls

你会看到类似与下面的信息:

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

通过运行makemigrations这个命令,你告诉Django你已经对你的模型做出了一些改动,并且你想要这些改动被存储。

Migrations是Django实现存储模型变化的原理,它们只是磁盘上的文件。如果你想要阅读migration的话,请打开polls/migration/0001_initial.py。当然这个文件是可以手动编辑的。

migrate这个命令会运行migrations和自动管理你的数据库模式。首先我们来看一下migration会运行什么样的SQL语句。sqlmigrate命令返回执行了什么样的SQL语句

$ python  manage.py  sqlmigrate  polls  0001

你可以看到类似与下面的信息:

BEGIN;
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
CREATE TABLE "polls_choice__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id"));
INSERT INTO "polls_choice__new" ("choice_text", "votes", "id", "question_id") SELECT "choice_text", "votes", "id", NULL FROM "polls_choice";
DROP TABLE "polls_choice";
ALTER TABLE "polls_choice__new" RENAME TO "polls_choice";
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");

COMMIT;

注意:

  • 输出的信息取决于你使用的数据库,官方的例子是使用PostgreSQL,我是使用SQLite。
  • 所创建数据表的名称是自动产生的,是应用的名称(这里是polls)加上模型名字的小写(比如,question和choice)
  • 主键(Primary Keys)会被自动创建
  • 按照约定,Django会在外键名后面加上_id

如果你感兴趣的话,你也可以运行python manage.py check这个命令。这只会检查你的工程是否有问题,而不会做migrations和创建数据库。

现在,运行migrate这个命令来在你的数据库中创建这些模型数据表

charies:mysite weichuang$ 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这个命令会执行所有还没有应用的migrations(Django会使用一个在数据库中特殊的数据表来跟踪哪些被应用,这个数据表叫做django_migrations)。

Migrations非常强大,允许你在开发工程的过程中随时改变你的模型,而不用删除已经存在的数据库或者数据表和重新创建新的。Migrations擅长更新你的数据库,而不会失去数据。记住模型改变的三个步骤:

  1. models.py改变你的模型
  2. 运行python manage.py migrate来创建这些变化的migrations
  3. 运行python manage.py migrate来应用数据库的变化

创建和应用migrations的命令分开的原因是你会将migrations提交到你的帮本控制系统。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值