Django作为一个Web框架,目的是实现MVC的分离,它可以自行处理 一些通用的操作,让开发人员可以专注于核心应用的开发。
现在一个工程环境就创建起来了,你现在可以让他工作起来。
你写的每个django应用都包含爱一个python包中,你的python路径某个地方,遵循一个确定的规则。
django带有一个自动生成应用程序基本目录结构的功能,因此你可以专注写代码而不用创建目录。
在这篇指导里,我们简单的在mysite目录里创建我们的投票程序,因而应用将和工程联系起来,投票程序将关联到mysite.polls.
接下来,我们将讨论应用程序的解耦。
确定你在mysite目录,创建你的应用,执行这个命令
python manage.py startapp polls
创建一个polls目录,布局如下:
polls/
__init__.py
models.py
views.py
- models.py:模型文件,用一个 Python 类来描述数据表,运用它可以通过简单的 Python 的代码来创建、检索、更新、删除数据库中的记录而无需写一条又一条的SQL语句。
- views.py:视图文件,用来联系模型与模版。
这些概念用简单的python类描述出来,像下面这样编辑books/models.py
from django.db import models
#
# Create your models here.
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()
def __unicode__(self):
return self.name
class Meta:
ordering = ['name']
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
def __unicode__(self):
return self.title
每个字段用一个Field类实例描述,CharField用于字符字段,DateTimeField 用于时间日期,这样告诉django掌握每个字段的类型。
field实例的名字就是这个field字段的名字,是友好的格式,在python里取值用,在数据库中当做表列名用。
你可以为Field指定参数,增加可读性。
一些Field类有必填元素,例如CharField需要指定max_length,这个参数不只是用在数据库元数据上,还用户数据校验。
最后,注意关心定义,使用ForeignKey.这个告诉Django每个选项关联到一个单独的投票上,Django支持所有数据关系定义。
多对一,多对多,一对一。
激活模型
一小段模型代码为Django提供了很多信息,通过这个,DJANGO将做如下事情
1.为应用程序创建数据库元数据
2.为投票对象,选项对象创建数据库操作API
不过首先我们需要先告诉工程投票程序安装好
再次编辑settings.py,修改INSTALLED_APPS 设置,加入'mysite.books'. 如下
1. INSTALLED_APPS = (
2. 'django.contrib.auth',
3. 'django.contrib.contenttypes',
4. 'django.contrib.sessions',
5. 'django.contrib.sites',
6. 'mysite.books'
7. )
默认配置中, INSTALLED_APPS 包含了下面的应用, 都是来源django:
- django.contrib.auth -- 一个认证系统.
- django.contrib.contenttypes -- 一个内容类型架构.
- django.contrib.sessions -- 一个会话架构.
- django.contrib.sites -- 一个多站管理架构.
这些应用默认包含以方便大多数情况的应用.
每个应用都至少用到一个数据表,因此我们需要先在数据库中创建表.
我们可以通过运行下面的命令来实现
python manage.py syncdb
syncdb 命令会查看 INSTALLED_APPS 设置并创建必要的数据表根据数据库设置参数. 你将会看到每个数据表创建的信息,并且会提示你是否创建一个认证系统的超级管理账号,继续。。
现在django知道mysite包含了polls应用. 我们运行另一个命令:
python manage.py sql books
你应该会看到类似如下的输出 (创建poll和choice的sql语句):
[ly@localhos1 mysite]$ python manage.py sql article
BEGIN;
CREATE TABLE "article_publisher" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
)
;
CREATE TABLE "article_author" (
"id" integer NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(40) NOT NULL,
"email" varchar(75) NOT NULL
)
;
CREATE TABLE "article_book_authors" (
"id" integer NOT NULL PRIMARY KEY,
"book_id" integer NOT NULL,
"author_id" integer NOT NULL REFERENCES "article_author" ("id"),
UNIQUE ("book_id", "author_id")
)
;
CREATE TABLE "article_book" (
"id" integer NOT NULL PRIMARY KEY,
"title" varchar(100) NOT NULL,
"publisher_id" integer NOT NULL REFERENCES "article_publisher" ("id"),
"publication_date" date NOT NULL
)
;
COMMIT;