Python Web编程(六)
通过以上的学习,应该基本掌握了Django的运行机制,页面表示,URL匹配,下面即将进入数据库的操作。
我用的是MySql,在Python中的MySql库可以在http://sourceforge.net/projects/mysql-python找到。
首先需要做的就是在settings.py中配置数据库。
DATABASE_ENGINE = 'mysql' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = 'pythontest' # Or path to database file if using sqlite3.
DATABASE_USER = 'root' # Not used with sqlite3.
DATABASE_PASSWORD = '319958' # Not used with sqlite3.
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
然后在我们的test1工程下面新建一个App,命令如下:
python manage.py startapp books
它创建了一个文件夹/books,下面有三个文件,
__init__.py,models.py,views.py。
呵呵,从名字也可以看出来,MVC。
一般的来说,Model层是跟数据库紧密结合的,并基本保持一致的。
View层就是模板了,也就是表示层,它将输出页面。
Control层就是业务层了,你的逻辑如果没有特殊情况应该放到这里面。
不说废话了,在models.py里面写代码吧。
from django.db import models
class Publisher(models.Model):
name = models.CharField(maxlength=30)
address = models.CharField(maxlength=50)
city = models.CharField(maxlength=60)
state_province = models.CharField(maxlength=30)
country = models.CharField(maxlength=50)
website = models.URLField()
class Author(models.Model):
salutation = models.CharField(maxlength=10)
first_name = models.CharField(maxlength=30)
last_name = models.CharField(maxlength=40)
email = models.EmailField()
headshot = models.ImageField(upload_to='/tmp')
class Book(models.Model):
title = models.CharField(maxlength=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
接下来需要激活和安装模型,在settings.py中找到INSTALLED_APPS,
然后将其内容修改如下:
INSTALLED_APPS = (
#'django.contrib.auth',
#'django.contrib.contenttypes',
#'django.contrib.sessions',
#'django.contrib.sites',
'test1.books',
)
最后,用下面命令验证一下整个Project中是否存在模型错误:
python manage.py validate
很不幸,出现一个错误,由于我们在class Author中用到了图像处理,需要下在另外的库:
http://www.pythonware.com/products/pil/
下载回来安装之后,在运行验证命令,就会发现已经不存在错误了。
在模型验证正确之后,就可以执行下面语句生成建表的SQL语句了:
python manage.py sqlall books
生成的结果如下:
BEGIN;
CREATE TABLE `books_publisher` (
`id` integer AUTO_INCREMENT 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 `books_book` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`title` varchar(100) NOT NULL,
`publisher_id` integer NOT NULL REFERENCES `books_publisher` (`id`),
`publication_date` date NOT NULL
);
CREATE TABLE `books_author` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`salutation` varchar(10) NOT NULL,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(40) NOT NULL,
`email` varchar(75) NOT NULL,
`headshot` varchar(100) NOT NULL
);
CREATE TABLE `books_book_authors` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`book_id` integer NOT NULL REFERENCES `books_book` (`id`),
`author_id` integer NOT NULL REFERENCES `books_author` (`id`),
UNIQUE (`book_id`, `author_id`)
);
CREATE INDEX books_book_publisher_id ON `books_book` (`publisher_id`);
COMMIT;
在MySql中执行一下上述语句,生成了四个表。
可以看出,Django的功能是很强大的。
当然,上面的命令只是生成SQL语句,Django提供了更快捷的方法,可以直接在数据库中建表:
python manage.py syncdb。
是不是有点儿心急,还没有讲到数据库操作呢。
先来试用一下吧。
运行python manage.py shell,然后输入以下代码:
from books.models import Publisher
p = Publisher(name='Apress', address='2560 Ninth St.',
city='Berkeley', state_province='CA', country='U.S.A.',
website='http://www.apress.com/')
p.save()
现在看一下数据库,是不是books_publisher有了一条数据?