本文档仅展示对官方文档有疑问或者有感触的地方。每次文档中出现大部分视图的改变时,更新 version。
- version-1: first-Django-app part 1-4
- version-2: first-Django-app part 4-5
- version-finall: first-Django-app part 5-8
- 部分成果截图
-
Integer 和 Bigint 的区别
区别在于存储范围的不同,Integer为 32 位,BigInt为 64 位。 -
连接数据库时报错
在连接数据库时遇见报错问题,在上一项目并未出现,使用pymysql修复。 -
输出 SQL 指令
使用python manage.py sqlmigrate polls 0001能输出对应的 MySQL 指令。 -
索引中的哈希值
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice"创建索引中的id_c5b4b260是什么?
id_c5b4b260为哈希值,为索引提供唯一性。 -
定制模型的字符串显示
def __str__(self):
return self.question_text为什么用 __str__()?用于给 Django 一个默认值,在显示 str 时可以显示文本内容。
-
反向关联
q.choice_set反向关联,为同一个问题生成选项。 -
‼️ ‼️ ‼️ 重要思想‼️ ‼️ ‼️
为什么我们使用辅助函数get_object_or_404()而不是自己捕获ObjectDoesNotExist异常?还有,为什么模型 API 不直接抛出ObjectDoesNotExist而是抛出Http404?
- 因为这样做会增加模型层和视图层的耦合性。指导 Django 设计的最重要的思想之一就是保证松散耦合。一些受控的耦合被包含在
django.shortcuts模块中。 - 对于耦合的理解:
(1) models 抛出异常时表示的是数据查询业务的异常,不涉及 views 也就是 http 协议相关的异常。如果直接用会导致非必要的耦合。
(2) 使用get_object_or_404()函数实现受控耦合,从而减少非必要耦合。
F()表达式
F()表达式可直接进行数据库操作,减少并发问题。
- 自定义上下文变量名
class IndexView(generic.ListView):
template_name = "polls/index.html"
context_object_name = "latest_question_list"
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by("-pub_date")[:5]此段代码中定义 context_object_name = "latest_question_list" 是为了给 Django 提供上下文变量名。
- ORM 查询条件
Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[:5]
此代码中的pub_date__lte为 ORM 中内置的查询条件,可作为判断语句使用。
‼️ ‼️ ‼️ 测试驱动开发‼️ ‼️ ‼️
一些程序员遵循一种称为“测试驱动开发”(TDD)的准则;他们实际上在编写代码之前先编写测试。这看起来可能违反直觉,但实际上它与大多数人经常做的事情类似:描述一个问题,然后编写一些代码来解决它。测试驱动开发将问题形式化为 Python 测试用例。
更普遍的情况是,一个刚接触自动化测试的新手更倾向于先写代码,然后再写测试。虽然提前写测试可能更好,但是晚点写起码也比没有强。
有时候很难决定从哪里开始下手写测试。如果你才写了几千行 Python 代码,选择从哪里开始写测试确实不怎么简单。如果是这种情况,那么在你下次修改代码(比如加新功能,或者修复 Bug)之前写个测试是比较合理且有效的。
个人感悟:
在读到此文档之前,本人开发文件都是开发驱动,再编写测试,甚至没有用到 Django 强大的测试功能。只是简单地对接口的返回进行检测。后续若有开发项目,将会学习该模式。
- 自定义后台界面和风格
现在在templates目录内创建一个名为admin的目录,并将默认的 Django 管理界面模板目录中的模板文件admin/base_site.html复制到该目录中。默认的 Django 管理界面模板目录位于 Django 源代码中(django/contrib/admin/templates)。
可覆盖 Django 默认模板实现自己功能。