fromdjango.db import models
# Createyour models here.
classWiki(models.Model):
pagename = models.CharField(max_length=20, unique=True)
content = models.TextField()
每个 model 其实在 Django 中就是一个表,你将用它来保存数据。在实际的应用中,一般都要与数据库打交道,如果不想用数据库,那么原因可能就是操作数据库麻烦,创建数据库环境也麻烦。但通过 Django 的 model 处理,它是一种 ORM (Object Relation Mapping, 对象与关系的映射),可以屏蔽掉底层数据库的细节,同时提供以对象的形式来处理数据。非常方便。而且 Django 的 model 层支持多种数据库,如果你改变数据库不是问题,这也为以后的数据库迁移带来好处。
Wiki 是 model 的名字,它需要从 models.Model 派生而来。它定义了两个字段,一个是字段是 pagename ,用来保存 wiki 页面的名字,它有两个参数,一个是最大长度(从这点上不如SQLAlchemy方便, SQLAlchemy并不需要长度,它会根据有无长度自动转为TEXT 类型),目前 CharField 需要这个参数;另一个是 unique 表示这个字段不能有重复值。还有一个字段是 content ,用来保存 wiki 页面的内容,它是一个 TextField 类型,它不需要最大长度。
在运行时, Django 会自动地为这个 model 增加许多数据操作的方法。关于 model 和 数据库操作API的详细内容参见 Model reference 和 Database API reference 的文档。
虽然我们的其它工作没有做完,但我还是想先安装一下 app 吧。每个 app 都需要安装一下。安装一般有两步:
- 修改settings.py
INSTALLED_APPS= (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'newtest.wiki',
)
- 执行(在newtest目录下)
manage.pysyncdb
以前是使用 install wiki 。现在也可以使用,不过使用 syncdb 要更简单得多。如果没有报错就是成功了。这一步 Django 将根据 model 的信息在数据库中创建相应的表。
我们假设首页的名字为 FrontPage ,并且我们将在命令行下增加它,让我们熟悉一下命令行的使用,进入 newtest目录,然后:
manage.pyshell
进入 python
>>>from newtest.wiki.models import Wiki
>>>page = Wiki(pagename='FrontPage', content='Welcome to Easy Wiki')
>>>page.save()
>>>Wiki.objects.all()
[<Wikiobject>]
>>>p = Wiki.objects.all()[0]
>>>p.pagename
'FrontPage'
>>>p.content
'Welcome toEasy Wiki'
因为在写这篇教程时是在magic-removal分枝下进行的操作,因此有些 API 并不稳定。象 objects 的方法以前是沿用model的方法,但后来进行了简化,比如 get_list() 变为 all() 。还有一系统的变化。具体的可参见 Removing The Magic 文档中关于Descriptor fields 的说明。
在 Django 中,对于数据库的记录有两种操纵方式,一种是集合方式,一种是对象方式。集合方式相当于表级操作,在0.92 中可以使用 model.objects 来处理。objects对象有一些集合方式的操作,如 all() 会返回全部记录,filter() 会根据条件返回部分记录。而象插入新记录则需要使用记录方式来操作。