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. MongoDB数据库数据清理

    清理MongoDB集群数据: 1.登录MongoDB集群(mongos): # mongo -u username -p password --authenticationDatabase admin ...

  2. django中的urlpatterns的正则语法

    ^ 指定起始字符或字符串,放进[]代表否定 $ 指定终止字符 / 对应原来的字符 [...] 括号中表示一个字符的格式设置 \d 任何一个数字字符 \D 非数字的字符 \w 任何一个字符[a-zA-Z ...

  3. SparkCore的性能优化

    1.广播变量 1.1. Spark提供的Broadcast Variable,是只读的,并且在每个节点上只会有一份副本,而不会为每个task都拷贝一份副本 1.2.它的最大作用,就是减少变量到各个节点 ...

  4. Java Applet基础——输出HelloWorld

    前言: 我自己不专用applet,仅仅是了解一下,如果有不对的地方,还望大家多多帮助~谢谢! 一. 准备环境 1. 安装Java的编译环境(另行百度哦~) 2. 下载 applet.jar ,放在项目 ...

  5. 【ABAP系列】SAP 使用事务码DBCO实现SAP链接外部数据库以及读取例程

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 使用事务码DBCO实现S ...

  6. 非常好的一个JS代码(FixedMenu.htm)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. DFS(深度优先搜索)和BFS(广度优先搜索)

    深度优先搜索算法(Depth-First-Search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种. 它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的 ...

  8. Akka简介与Actor模型(一)

    前言...... Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台.本文主要是个人对Akka的学习和应用中的一些理解. Actor模型 ...

  9. 如何解决Oracle11g使用dmp命令无法导出空表问题

    如何解决Oracle11g使用dmp命令无法导出空表问题 导出:exp  username/password@orcl file=路径 tables=(tb1)    //tables=(tb1)可有 ...

  10. Ruby Rails正式学习:Ruby on Rails 做个演示项目吧,逐渐完善

    项目开始 一. 新建Rails项目 1. 修改一下Gemfile文件(简单修改一下) source 'https://rubygems.org' git_source(:github) { |repo ...