Django学习 - Model
发布者:
Tank
一、安装数据库适配器
我这里用的MySQL-python-1.2.3.win32-py2.7.exe 这是一个python库,安装后位于,$PYTHON_HOME/lib/site-packages/MySQLdb 这样我们就可以在Python代码里面通过MySQLdb访问MySQL了
C:\Users\tanli>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> print MySQLdb.__version__
1.2.3
>>> MySQLdb.connect(user='root', db='test', passwd='', host='localhost')
<_mysql.connection open to 'localhost' at 25c62e8>
二、设置项目数据库
在项目的配置文件settings.py中指定数据库引擎
# Database
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangodb',
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
打开django project python shell测试数据库连接
F:\toycode\django-project\mysite>python manage.py shell
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.db import connection
>>> cursor = connection.cursor()
>>>
如果没有显示什么错误信息,那么你的数据库配置是正确的。
三、为项目创建App
现在已经确认数据库连接正常工作了,让我们来创建一个 Django app,一个包含模型,视图和Django代码 ,并且形式为独立Python包的完整Django应用, 这里我们新建一个books应用。
E:\toycode\django-project\mysite\mysite>manage.py startapp books
E:\toycode\django-project\mysite\mysite>
mysite
mysite
manage.py
books
__init.py__
admin.py
models.py
test.py
views.py
四、创建Model类
这里用书籍-作者-出版商为例说明,书籍有书名和出版日期。 它有一个或多个作者 (和作者是多对多的关联关系), 只有一个出版商(和出版商是一对多的关联关系,也被称作外键).编辑models.py
from django.db import models
# Create your models here.
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()
每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。 属性名就是字段名, 它的类型(例如 CharField )相当于数据库的字段类型 (例如 varchar )。 每个数据库表对应一个类”这条规则的例外情况是多对多关系。 在我们的范例模型中, Book 有一个 多对多字段 叫做 authors 。 该字段表明一本书籍有一个或多个作者, 但 Book 数据库表却并没有 authors 字段。 相反,Django创建了一个额外的表(多对多连接表) 来处理书籍和作者之间的映射关系。最后需要注意的是,我们并没有显式地为这些模型定义任何主键。 除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段id,每个Django模型都要求有单独的主键.
五、 Model部署到数据库
修改项目配置文件,激活books APP
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mysite.books',
)
现在我们可以创建数据库表了。 首先,用下面的命令验证项目模型的有效性:
F:\toycode\django-project\mysite>python manage.py validate
0 errors found
validate 命令检查你的模型的语法和逻辑是否正确。 如果一切正常,你会看到 0 errors found 消息。 如果出错,请检查你输入的模型代码。如果出错,请检查你输入的模型代码。 错误输出会给出非常有用 的错误信息来帮助你修正你的模型。
模型确认没问题了,运行下面的命令来查看Django生成的对应的sql语句
F:\toycode\django-project\mysite>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_author` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(40) NOT NULL,
`email` varchar(75) NOT NULL
)
;
CREATE TABLE `books_book_authors` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`book_id` integer NOT NULL,
`author_id` integer NOT NULL,
UNIQUE (`book_id`, `author_id`)
)
;
ALTER TABLE `books_book_authors` ADD CONSTRAINT `author_id_refs_id_1a0a2829` FOR
EIGN KEY (`author_id`) REFERENCES `books_author` (`id`);
CREATE TABLE `books_book` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`title` varchar(100) NOT NULL,
`publisher_id` integer NOT NULL,
`publication_date` date NOT NULL
)
;
ALTER TABLE `books_book` ADD CONSTRAINT `publisher_id_refs_id_974c2a46` FOREIGN
KEY (`publisher_id`) REFERENCES `books_publisher` (`id`);
ALTER TABLE `books_book_authors` ADD CONSTRAINT `book_id_refs_id_0a3634f3` FOREI
GN KEY (`book_id`) REFERENCES `books_book` (`id`);
CREATE INDEX `books_book_authors_36c249d7` ON `books_book_authors` (`book_id`);
CREATE INDEX `books_book_authors_e969df21` ON `books_book_authors` (`author_id`)
;
CREATE INDEX `books_book_81b79144` ON `books_book` (`publisher_id`);
COMMIT;
原来django 为了我们处理好具体的sql操作,现在把这些sql提交到数据库,为model建表
F:\toycode\django-project\mysite>python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table books_publisher
Creating table books_author
Creating table books_book_authors
Creating table books_book
You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'tanli'): admin
Email address: tank.li@asml.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
syncdb 命令是同步你的模型到数据库的一个简单方法。 它会根据 INSTALLED_APPS 里设置的app来检查数据库, 如果表不存在,它就会创建它
六、访问数据
有了Django 的model,就可以使用这些模型的高级的Python API了,所以的一切都是python object上的操作,不再关心数据库中的具体存储,那是框架该做的事。
F:\toycode\django-project\mysite>python manage.py shell
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from books.models import Publisher
>>> p1 = Publisher(name='HUST', address='Hubei', city='Wuhan')
>>> p2 = Publisher(name='ECJTU', address='Jiangxi', city='Nanchang')
>>> p1.save()
>>> p2.save()
>>> print p1
HUST
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: HUST>, <Publisher: ECJTU>]
调用对象的 save() 方法,将对象保存到数据库中。 Django 会在后台执行一条 INSERT 语句。 这里publisher_list显示的这么友好是因为,Publisher我们自定义一个__unicode__方法, 用于Publisher对象的输出。除了save, 还有filter, delete等。
七、创建模板
创建显示出版商的页面模板publisherlist.html
<ul>
{ % for publisher in publishers % }
<li> { { publisher.name } } </li>
{ % endfor % }
</ul>
修改项目配置文件指定自动加载目录
TEMPLATE_DIRS = (
'F:/toycode/django-project/mysite/templates',
)
八、写视图函数
编辑 books/views.py
from django.shortcuts import render
# Create your views here.
from django.shortcuts import render_to_response
from books.models import Publisher
def publisherlist(request):
list = Publisher.objects.all()
return render_to_response('publisherlist.html', {'publishers':list})
九、配置URL
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url('^publishers/$','books.views.publisherlist'),
)
至此就是一个数据库驱动的web应用了,localhost:8000/publishers预览
睿初科技软件开发技术博客,转载请注明出处
blog comments powered by Disqus
发布日期
标签
最近发表
- volatile与多线程
- TDD practice in UI: Develop and test GUI independently by mockito
- jemalloc源码解析-核心架构
- jemalloc源码解析-内存管理
- boost::bind源码分析
- 小试QtTest
- 一个gtk下的目录权限问题
- Django学习 - Model
- Code snippets from C & C++ Code Capsule
- Using Eclipse Spy in GUI products based on RCP
文章分类
- cpp 3
- wxwidgets 4
- swt/jface 1
- chrome 3
- memory_management 5
- eclipse 1
- 工具 4
- 项目管理 1
- cpplint 1
- 算法 1
- 编程语言 1
- python 5
- compile 1
- c++ 7
- 工具 c++ 1
- 源码分析 c++ 3
- c++ boost 2
- data structure 1
- wxwidgets c++ 1
- template 1
- boost 1
- wxsocket 1
- wxwidget 2
- java 2
- 源码分析 1
- 网路工具 1
- eclipse插件 1
- django 1
- gtk 1
- 测试 1
- 测试 tdd 1
- multithreading 1