您的位置:首页 > 编程语言 > Go语言

Django学习笔记(第五节)模型(1)

2015-05-08 22:16 337 查看
就像HTML可以硬编码在views.py中一样,Django的数据库操作也可以在views.py中进行。

由于在创建Django项目的时候会自动添加sqlite,所以这里以sqlite数据库为例:

def book_list(request):
cursor = connection.cursor()
cursor.execute('create table if no exits books (id integer primary key autoincrement , name varchar(60) )')
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
cursor.close()
return render_to_response('book_list.html', {'names':names})
当我们一次次去连接数据库,编写sql,甚至是换数据库时,这种写法就非常不方便了。

Django致力于解决这样的问题:

from django.shortcuts import render_to_response
from mysite.books.models import Book

def book_list(request):
books = Book.objects.order_by('name')
return render_to_response('book_list.html', {'books': books})


在了解模型之前,我们先回顾一下MVC和MTV模式。

MTV 开发模式

Model-View-Controller (MVC)模式是把数据存取逻辑、业务逻辑和表现逻辑组合在一起的软件架构模式。

在这个模式中, Model 代表数据存取层,View 代表的是视图部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

MVC模式有广泛的应用,从struts到android都使用了MVC模式。

Django中MVC模式的含义

M ,数据存取部分,由django数据库层处理,本章要讲述的内容。

V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。

C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

数据库配置

如果是使用sqlite的话就不需要进行数据库配置。其他数据库则需要进行配置。

打开setting.py,查找数据库配置:

DATABASE_ENGINE = ''#Django使用的数据库引擎
DATABASE_NAME = ''#数据库名称
DATABASE_USER = ''#用户,sqlite空即可
DATABASE_PASSWORD = ''#密码,sqlite空
DATABASE_HOST = ''#数据库服务器主机地址,如果Django与数据库在同一台计算机上,可以保留空白
DATABASE_PORT = ''#主机端口
例如如sqlite,则是以下配置:

# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases 
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}


第一个应用程序

根据约定,如果使用Django数据库模型,就必须创建一个Django app。模型必须存放在apps中。

如果使用的开发工具是eclipse+pydev,只需要右键你的poject-->Django-->Create Application(manage.py startapp),在弹出的对话框中数据你的app名称即可。

如果使用命令那么进入你的工程目录,输入命令:python manage.py startapp books

在Python代码里定义模型

在代码中定义模型也是有一些弊端的,如果你修改了一个Django模型, 你要自己来修改数据库来保证和模型同步。

Django提供了实用工具来从现有的数据库表中自动扫描生成模型。 这对已有的数据库来说是非常快捷有用的。

第一个模型

我们来假定下面的这些概念、字段和关系:

一个作者有姓,有名及email地址。

出版商有名称,地址,所在城市、省,国家,网站。

书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])

打开models.py文件,输入代码

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()
这三个class实际上相当于创建了三张表。

模型安装

打开settings.py文件,找打INSTALLED_APPS,注释掉初始默认值,在结尾添加上『'mysite.books',』,注意结尾的逗号一定要有。

在1.4教程中:

执行python manage.py validate命令检查模型的语法和逻辑是否正确。

然后执行python manage.py sqlall books命令,其中books是APP名称。

我使用的是Django1.7,如果执行这两个命令,会报importError:No module namede books

查看了一下官方文档,说是使用新命令python manage.py makemigrations books

据论坛网友亲测 1.6版本python manage.py sql books,1.8版本与1.7一致。

输入命令提示成功如下:



这时候刷新项目,发现books->migrations下多出来一个0001_initial.py的文件。里面就是一下创建的方法。

然后我执行了python
manage.py syncdb命令,在命令行中引导我设置了用户名密码和邮箱。

然后执行python
manage.py shell命令,输入代码:

>>> 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()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
...     city='Cambridge', state_province='MA', country='U.S.A.',
...     website='http://www.oreilly.com/')
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]
这段代码的含义是导入Publisher类,设置p1的字段值,调用save方法保存到数据库。Publisher.objects.all()方法的底层实际是一个SQL的select语句。

需要注意到是,只有调用了save方法,数据才会真正保存到数据库。

当然也可以一步完成创建对象和保存到数据库的操作,只要使用Publisher.objects.create方法,参数写法与上例中的相同。

至此模型的创建,以及添加数据,读取数据都已经完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: