ORM—对象关系映射器,是一个数据抽象层,描述存储在数据库中的表,行和列。处理数据库时,可以使用熟悉的面向对象方式,写出更好的代码。
在ORM的概念中,类对应数据库中的表,属性对应列,类的单个实例表示数据库中的一行数据。
Django对ORM提供了良好的支持,学习ORM的绝佳方法是单元测试中使用她,因为单元测试能按照指定方式使用ORM。
在tests.py中新建一个类
class ItemModelTest(TestCase): def test_saving_and_retrieving_items(self): first_item = Item() first_item.text = 'The first (ever) list item' first_item.save() second_item = Item() second_item.text = 'Item the second' second_item.save() saved_items = Item.objects.all() self.assertEqual(saved_items.count(), 2) first_saved_item = saved_items[0] second_saved_item = saved_items[1] self.assertEqual(first_item.text, 'The first (ever) list item') self.assertEqual(second_item.text, 'Item the second')
从上面的代码可以看出,在数据库中创建新记录的过程很简单:先创建一个对象,再为一些属性赋值,然后调用.save()函数。
Django提供了一个查询数据库的API,即类属性.objects,再使用可能时最简单的查询方法.all(),取回这个表的全部记录。得到的结果是一个类似列表的对象,从这个对象中可以提取出单个对象,然后还可以再调用其他函数,如.count()。
接着检查存储在数据库中的对象,看保存的信息是否正确。
运行单元测试:
AssertionError: '1: Buy peacock feathers' not found in ['1: Use peacock feathers to make a fly']
下面进入另一个单元测试/编写代码循环,在models.py中写入一些代码,让它有内容可导入。
from django.db import models # Create your models here. from django.db import models class Item(object): pass
单元测试,
AttributeError: 'Item' object has no attribute 'save'
为了给Item类提供save方法,也为了让这个类变成真正的Django模型,要让它继承Model类:
from django.db import models # Create your models here. from django.db import models class Item(models.Model): pass
再次运行单元测试,会看到一个数据库错误:
django.db.utils.OperationalError: no such table: lists_item