Python · 2011-08-09

django学习笔记——进阶——模型

新建应用程序

在开始之前需要新建一个应用程序。在这之前我们已经创建了 project , 那么 project 和 app 之间到底有什么不同呢? 它们的区别就是一个是配置另一个是代码。也就是说一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。

在“ mysite“ 项目文件下输入下面的命令来创建“ books“ app
python manage.py startapp books
这个命令在mysite目录下新建了一个book的app应用程序

模型

模型创建的流程
1:在settings.py中配置数据库信息
2:在app中models.py文件里定义模型

from django.db import models

class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()

class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

每个模型相当于单个数据库表,每个属性也是这个表中的一个字段

3:模型安装
编辑 settings.py 文件, 找到 INSTALLED_APPS 设置,INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态.

INSTALLED_APPS = (
# ‘django.contrib.auth’,
# ‘django.contrib.contenttypes’,
# ‘django.contrib.sessions’,
# ‘django.contrib.sites’,
‘mysite.books’,
)

首先,用下面的命令对校验模型的有效性:
python manage.py validate
没问题之后运行下面的命令来生成 CREATE TABLE 语句:
python manage.py sqlall books
然后通过下列命令执行SQL
python manage.py syncdb
syncdb 命令是同步你的模型到数据库的一个简单方法。 它会根据 INSTALLED_APPS 里设置的app来检查数据库, 如果表不存在,它就会创建它。 需要注意的是, syncdb 并 不能 同步模型的修改到数据库。 (本章的最后将详细讨论修改数据库的架构)

基本数据访问

from books.models import Publisher
p1 = Publisher(name=’Apress’, address=’2855 Telegraph Avenue’,
city=’Berkeley’, state_province=’CA’, country=’U.S.A.’,
website=’http://www.apress.com/’)
p1.save()
publisher_list = Publisher.objects.all()

首先,导入Publisher模型类, 通过这个类我们可以与包含 出版社 的数据表进行交互。
接着,创建一个“ Publisher“ 类的实例并设置了字段“ name, address“ 等的值。
调用该对象的 save() 方法,将对象保存到数据库中。 Django 会在后台执行一条 INSERT 语句。
最后,使用“ Publisher.objects“ 属性从数据库取出出版商的信息,这个属性可以认为是包含出版商的记录集。 这个属性有许多方法,这里先介绍调用“ Publisher.objects.all()“ 方法获取数据库中“ Publisher“ 类的所有对象。这个操作的幕后,Django执行了一条SQL “ SELECT“ 语句。

注意:当你使用Django modle API创建对象时Django并未将对象保存至数据库内,除非你调用“ save()“ 方法
如果需要一步完成对象的创建与存储至数据库,就使用“ objects.create()“ 方法

p1 = Publisher.objects.create(name=’Apress’,
address=’2855 Telegraph Avenue’,
city=’Berkeley’, state_province=’CA’, country=’U.S.A.’,
website=’http://www.apress.com/’)

查询数据
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 Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()

def __unicode__(self):
return self.name

class Meta:
ordering = [‘name’]

class Meta,内嵌于 Publisher 这个类的定义中(如果 class Publisher 是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统 )。你可以在任意一个 模型 类中使用 Meta 类,来设置一些与特定模型相关的选项