最好使用对机器友好的类别名,因为你不仅在python中会使用到它,数据建库也会使用它作为数据库字段。
激活模型
将polls应用安装项目中
为了在我们的工程中使用包含这个应用,我们需要在配置类INSTALLED_APPS中添加配置,因为PollsConfig类写在文件polls/apps.py中,即在INSTALLED_APPS中添加’polls.apps.PollsConfig’,
随后启动终端,运行:python manage.py makemigrations polls
将会看到类似这样的输出:
‘Migrations for ‘polls’:
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice’
注解:通过运行makemigrations命令,Django会检测你对模型文件的修改(在这种情况下,你已经获得了一次修改,并将修改的比分储存为一次迁移)
- 迁移
迁移是Django对于模型定义(也就是你的数据库结构)的变化的储存方式。它们其实也是一些你磁盘上的文件。
如果你想的话,也可以阅读迁移文件(在polls/migrations/0001_initial.py),已经被设计成人类可读的模式。
- 迁移命令会执行哪些SQL语句?
sqlmigrate命令接收一个迁移的名称,然后返回相应的SQL
$ python manage.py sqlmigrate polls 0001
返回:
'--
- 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;’
- 注意一下几点:
- 输出内容和你使用的数据库有关,上
- 数据库的表明
- 主键IDS
- 默认的
- 外键关系
- 生成的SQL语句
- 这个sqlmigrate命令并没有真正在你的数据库中执行迁移,他只是把一些命令输到电脑屏幕上,让你看看Django认为需要执行哪些SQL语句。这在你想看看Django到底想看什么&想要批量对数据库进行操作时很有帮助。
- 执行 $ python manage.py migrate
在数据库中创建新定义的模型的数据表。
注释:这个migrate命令用来查看还没有执行过哪些迁移(Django通过在数据库中创建一个特殊的表django_migrations来跟踪执行过哪些迁移)并应用到数据库上,也就是将你对模型的修改同步更新到数据库结构上。
总结
总之,改变模型只需要以下三步
-
编辑models.py文件,改变模型
-
$ python manage.py makemigrations 为模型的改变生成迁移文件。
-
$ python manage.py migrate 用来应用数据库迁移。
-
数据库迁移被分解为生成迁移文件和应用,是为了让我们能够在代码上控制西永上提交迁移数据并在数据库上使用。
如果修改了setting.py文件,大概率不需要migrate什么命令的,直接保存然后重新启动即可,而且在models.py文件中做修改时,除非是添加新的模型,不然是不需要添加到消息队列中(即:$ python manage.py makemigrations ) -
写完视图view.py,就要把他们加入到urls中了。
-
怎么又和想象的不太一样了呢?
-
应该是我没有定义对应的投票id,所以才找不到,但是我访问也是一样的结果诶。
-
写一个真正有用的视图
-每个视图必须要做的只有两件事,1、放回一个包含请求页面内容的HttpResponse对象,或者是抛出一个异常,比如Http404.至于你还想干嘛,随便你。
你的视图可以从数据库里读取记录,可以使用一个模板引擎,可以生成一个PDF文件,可以输出XML,也可创建一个ZIP文件,可以做任何想做的事情,只要使用对应的python库。 -
一个快捷函数render()
载入模板,填充上下文,再返回它生成的HttpResponse对象,这是一个非常常用的操作流程。于是Django提供了这么一个快捷函数。我们使用它来重写index()视图。 -
抛出404异常
-
另外一个快捷函数:get_object_or_404()
尝试用get()函数获取一个列表,如果不存在就抛出Http404异常也是一个普遍的流程,所以Django也封装了一个常用的函数。 -
模板系统:
-模板系统统一使用点符号来范文变量的属性,例如在示例中又{{question.question_text}}
首先Django尝试对question对象使用字典查找,也就是使用obj.get(str)操作,如果失败了就使用属性查找,结果成功了,如果还是失败了,就使用列表查找。 -
取出模板中的硬编码URL硬编码和强耦合的链接,修改起来是十分困难的,然而,因为你在polls.urls的url()函数中通过name 参数修改URL,定义了名字,你就可以使用{ % url %}来代替它。