调整模型 - yann学长的运维开发指南44

in #devops8 years ago

目前进度

第6章的内容比较长,所以拆分成了若干个小节说明,以下为当前进度:

确保功能测试之间相互隔离
解决页面刷新延迟
使用TDD 实现新设计
逐步迭代,实现新设计
使用Django测试客户端一起测试视图、模板和URL
用于添加待办事项的URL和视图
调整模型

http://www.iamyann.com/images/0711/20180711142109.png
(html comment removed: more)

内容介绍

  • 调整模型
  • 调整测试
  • 故障排除
  • 迁移数据库
  • 用外键实现关联
  • 测试修改成果
  • 根据模型调整代码
  • 修正第一个错误
  • 修正其他错误

调整模型

前面做了很多修改,现在调整一下,让代码更好看一点

调整测试

先看视图部分

vi lists/tests.py

http://www.iamyann.com/images/0711/20180711111448.png

新建了一个list对象,通过给.list属性赋值把代办事项归在对象下面
list是关键字,所以写成list_区别

对比数据库中保存的值和list_的值

故障排除

修改了测试类后,会出现许多熟悉的错误
让我们来一一排查

python manage.py test lists
#
ImportError: cannot import name 'List'

需要在models.py里建一个Item类

python manage.py test lists
#
AttributeError: 'List' object has no attribute 'save'

没有save属性,object改为继承model类

python manage.py test lists
#
django.db.utils.OperationalError: no such table: lists_list

数据库相关的故障

迁移数据库

python manage.py makemigrations
#
self.assertEqual(first_saved_item.list, list_)
AttributeError: 'Item' object has no attribute 'list'

用外键实现关联

Item没有list属性,要想办法实现
先做个text属性试试

vi lists/models.py

http://www.iamyann.com/images/0711/20180711114050.png

测试修改成果

python manage.py test lists
#
django.db.utils.OperationalError: no such column: lists_item.list

迁移一下

python manage.py makemigrations
#
AssertionError: 'List object' != <List: List object>

Django只保存了list对象的字符串形式
如果要保存对象之间的关系需要用外键

vi lists/models.py

http://www.iamyann.com/images/0711/20180711134002.png

再做一次数据库迁移

rm lists/migrations/0004_item_list.py
python manage.py makemigrations

根据模型调整代码

python manage.py test lists
#
ERROR: test_displays_all_items (lists.tests.ListViewTest)
django.db.utils.IntegrityError: NOT NULL constraint failed: lists_item.list_id
......

修正第一个错误

vi lists/tests.py

http://www.iamyann.com/images/0711/20180711141111.png

为代办事项创建父清单

修正其他错误

vi lists/views.py

http://www.iamyann.com/images/0711/20180711141424.png

调用代办事项的父清单
修改之后测试通过

预告

今天的内容也差不多了,下次会修改另一个内容,敬请期待

时间过的飞快,下节再见

http://hero.iamyann.com/blog_webchat.jpg