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

Django学习系列13:Django ORM和第一个模型的更多相关文章

  1. Django学习系列之django分页

    基本语法实例 from django.core.paginator import Paginator objects = Post.objects.filter(status='published') ...

  2. Django学习系列之django restframework

    曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful A ...

  3. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  4. Django学习系列14:第一个数据库迁移

    在Django中,ORM的任务是模型化数据库. 创建数据库其实是由另一个系统负责的叫做迁移. 迁移的任务是根据你对models.py文件的改动情况,添加或删除表和列. 可以把迁移想象成数据库使用的版本 ...

  5. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  6. Django学习系列5:为视图编写单元测试

    打开lists/tests.py编写 """向浏览器返回真正的HTML响应,添加一个新的测试方法""" from django.test i ...

  7. Python&Django学习系列之-激活管理界面

    1.创建你个人的项目与APP 2.填写你的数据库名称与数据库类型,这里使用内置的sqllite3 3.修改setting文件 a.将'django.contrib.admin'加入setting的IN ...

  8. Django学习系列之重写User模型和登录验证

    重写User模型 Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段 创建users app startapp users 修改settings.py配置文件,覆盖默认 ...

  9. Django学习系列之中间件

    中间件的定义 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类 django请求生命周期 自定义中 ...

随机推荐

  1. eclipse 建立 web fragment project 工程

    1.鼠标右键---------new ---------Other 2.选择WEB----web fragment project 3.输入工程名,点finish

  2. 关于Thread ThreadPool Parallel 的一些小测试demo

    using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading ...

  3. weiphp记录

    jae 上传必须包括这2个文件,不然又会重新安装 标志文件有两个:Application/Install/Data/install.lockApplication/User/Conf/config.p ...

  4. 统计学习方法 | 第1章 统计学习方法概论 | np.random.rand()函数

    np.random.rand()函数 语法: np.random.rand(d0,d1,d2……dn) 注:使用方法与np.random.randn()函数相同 作用: 通过本函数可以返回一个或一组服 ...

  5. 我理解的CLH

    学而时习之,不亦说乎!                              --<论语> 原创,转载请附原文链接,谢谢. CLH 思路 保持时序的锁基本思路就是将等待获取锁的线程放入 ...

  6. Zookeeper入门(一)

      Zookeeper是分布式服务治理中间件   一.Zookeeper的简介   官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用 ...

  7. lua编译器和ide

    这里有一个网址,上面记录了大部分流行的LUA开发工具,包括IDE和Editor. http://www.wowwiki.com/Lua_editors 一.Eclipse LDT 1.语法高亮,自动提 ...

  8. [转帖]Docker常用命令总结

    Docker常用命令总结 http://www.ha97.com/5546.html 发表于: Linux, 互联网, 虚拟化与云计算 | 作者: 博客教主 标签: docker,常用命令,总结 PS ...

  9. 查找担保圈-step2-拆分成员表函数

    USE [test] GO /****** Object: UserDefinedFunction [dbo].[tf_split_char] Script Date: 2019/7/8 14:39: ...

  10. 【NOIP2017】跳房子

    这题我0分. 比赛时,我一眼出正解,哈哈,太水了! 这题不就是一个二分+DP+单调队列吗? 然而,细节决定成败. 我错了许多细节,就挂了. 我只考了0分... 首先,这题满足一个条件: 保证g变大后, ...