6.9
在6.9.4中有一段代码很令人疑惑,书里解释叫“反向查询”,是Django提供的非常有用的ORM功能,可以再其他表中查询某个对象的相关记录。
<table id="id_list_table">
{% for item in list.item_set.all %}
<tr><td>{{ forloop.counter }}: {{ item.text }}</td></tr>
{% endfor %}
</table>
中间的item_set其实是一个默认的名字,是一个管理器。在models.py中Item的外键叫list,和List表关联。这个管理器可返回List表实例所对应的Item表的实例。用SQL来表示就是
select *
from Item i
where i.list = 2
这个管理器的名字默认就是原模型的小写名称加上'_set',可以在设置外键的时候通过related_name参数修改此名称
list = models.ForeignKey(List, default=None, on_delete=models.CASCADE,related_name='litem')
不过就算不作任何修改,默认的item_set名字也比较通俗易懂。
6.10
TDD概念和经验法则
测试隔离和全局状态
不同的测试之间不能彼此影响,也就是说每次测试结束后都要还原所做的永久性操作。Django的测试运行程序可以帮助我们创建一个测试数据库,每次测试结束后都会清空数据库
从一个可运行状态到另一个可运行状态(又叫测试山羊与重构猫)
本能经常驱使我们直接动手一次修正所有问题,但如果不小心,最终可能像重构猫一样,改动了很多代码但都不起作用。测试山羊建议我们一次只迈一步,从一个可运行状态走到另一个可运行状态
YAGNI
"You ain't gonna need it" (你不需要这个) 的简称,劝诫你不要受诱惑编写当时看起来可能有用的代码。很有可能你根本用不到这些代码,或者没有准确预见未来的需求。