新建应用程序
在开始之前需要新建一个应用程序。在这之前我们已经创建了 project , 那么 project 和 app 之间到底有什么不同呢? 它们的区别就是一个是配置另一个是代码。也就是说一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。
在“ mysite“ 项目文件下输入下面的命令来创建“ books“ app python manage.py startapp books 这个命令在mysite目录下新建了一个book的app应用程序
模型
模型创建的流程 1:在settings.py中配置数据库信息 2:在app中models.py文件里定义模型
每个模型相当于单个数据库表,每个属性也是这个表中的一个字段
3:模型安装 编辑 settings.py 文件, 找到 INSTALLED_APPS 设置,INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态.
首先,用下面的命令对校验模型的有效性: python manage.py validate 没问题之后运行下面的命令来生成 CREATE TABLE 语句: python manage.py sqlall books 然后通过下列命令执行SQL python manage.py syncdb syncdb 命令是同步你的模型到数据库的一个简单方法。 它会根据 INSTALLED_APPS 里设置的app来检查数据库, 如果表不存在,它就会创建它。 需要注意的是, syncdb 并 不能 同步模型的修改到数据库。 (本章的最后将详细讨论修改数据库的架构)
基本数据访问
首先,导入Publisher模型类, 通过这个类我们可以与包含 出版社 的数据表进行交互。 接着,创建一个“ Publisher“ 类的实例并设置了字段“ name, address“ 等的值。 调用该对象的 save() 方法,将对象保存到数据库中。 Django 会在后台执行一条 INSERT 语句。 最后,使用“ Publisher.objects“ 属性从数据库取出出版商的信息,这个属性可以认为是包含出版商的记录集。 这个属性有许多方法,这里先介绍调用“ Publisher.objects.all()“ 方法获取数据库中“ Publisher“ 类的所有对象。这个操作的幕后,Django执行了一条SQL “ SELECT“ 语句。
注意:当你使用Django modle API创建对象时Django并未将对象保存至数据库内,除非你调用“ save()“ 方法 如果需要一步完成对象的创建与存储至数据库,就使用“ objects.create()“ 方法
查询数据 Publisher.objects.all() 查询出表的所有数据 数据过滤 Publisher.objects.filter(name=’Apress’) 查询出name为apress值的记录 Publisher.objects.filter(country=”U.S.A.”, state_province=”CA”) 包含性查找 Publisher.objects.filter(name__contains=”press”) 查找出name中包含press的记录。在 name 和 contains 之间有双下划线。其他的一些查找类型有: icontains (大小写无关的 LIKE ), startswith 和 endswith , 还有 range 获取耽搁数据 Publisher.objects.get(name=”Apress”) 如果结果是多个对象,会导致抛出异常:如果查询没有返回结果也会抛出异常
排序
Publisher.objects.order_by(“state_province”, “address”) 逆向排序 Publisher.objects.order_by(“-name”) 连锁 Publisher.objects.filter(country=”U.S.A.”).order_by(“-name”)
限制返回数量 Publisher.objects.order_by(‘name’)[0] 返回第一个 相当于 SELECT id, name, address, city, state_province, country, website FROM books_publisher ORDER BY name LIMIT 1; 取出特定子集 Publisher.objects.order_by(‘name’)[0:2] 类似于 SELECT id, name, address, city, state_province, country, website FROM books_publisher ORDER BY name LIMIT 0,2;
更新数据 更新单个字段 Publisher.objects.filter(id=52).update(name=’Apress Publishing’) 类似于 UPDATE books_publisher SET name = ‘Apress Publishing’ WHERE id = 52;
更新多个字段 p = Publisher.objects.get(name=’Apress’) p.name = ‘Apress Publishing’ p.save() 类似于 SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name = ‘Apress’;
UPDATE books_publisher SET name = ‘Apress Publishing’, address = ‘2855 Telegraph Ave.’, city = ‘Berkeley’, state_province = ‘CA’, country = ‘U.S.A.’, website = ‘http://www.apress.com’ WHERE id = 52; 在这个例子里我们可以看到Django的save()方法更新了不仅仅是name列的值,还有更新了所有的列。 若name以外的列有可能会被其他的进程所改动的情况下,只更改name列显然是更加明智的
删除数据 p = Publisher.objects.get(name=”O’Reilly”) p.delete() 删除多条记录 Publisher.objects.filter(country=’USA’).delete()
指定模型的缺省排序方式
class Meta,内嵌于 Publisher 这个类的定义中(如果 class Publisher 是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统 )。你可以在任意一个 模型 类中使用 Meta 类,来设置一些与特定模型相关的选项