Djanog学习笔记-模型
数据库驱动网站:在后台连接数据库服务器,从中取出一些数据,然后在Web页面用漂亮的格式展示这些数据。网站还可能会向访问者提供修改数据库数据的方法。
在视图中进行数据库查询的笨方法
笨方法:用现有的任何Python类库执行一条SQL查询并对 结果进行一些处理,eg:
from django.shortcuts import render_to_response
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
cursor = db.cursor()
cursor.execute('SELCT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render_to_response('book_list.html', {'names': names})
笨方法引发的问题:
实际问题 | 理想情况 |
---|---|
我们将数据库连接参数硬性编码于代码中 | 这些参数应当保存在Django配置中 |
我们不得不重复同样的代码:创建数据库连接、创建数据库游标、执行语句、关闭数据库 | 我们所需要应该只是指定所需的结果 |
它把我们栓死在MySQL之上,如果我们要从MySQL换到PostgreSQL,就不得不使用不同的数据库适配器(例如psycopg而不是MySQLdb)改变连接参数,根据SQL语句的类型可能还要修改SQL | 应对所使用的数据库服务器进行抽象,这样一来只在一处修改即可变换数据库服务器 |
Django数据库层:
正是解决以上问题的,下面使用Django数据库API重写之前的视图:
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})
MTV开发模式:
把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念称为软件架构的Model-View-Controller(MVC)模式。
其中,Model代表数据存取层,View代表的是系统中选择显示什么和怎么显示的部分,Controller指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的哪部分。
Django也遵循这种MVC模式,可以称得上是一种MVC框架,以下是Django中的M、V、C各自的含义:
M:数据存取部分,由django数据库层处理;
V:选择哪些数据要显示以及怎样显示,由视图和模板处理;
C:根据用户输入委派视图的部分,由Django框架根据URLconf设置,对给定URL调用适当的Python函数;
C由框架自行处理,而Django里更关注的是模型(Model)、模板(Template)、视图(Views),Django也被称为MTV框架,在MTV开发模式中:
M:代表模型(Model),即数据存取层,该层处理与数据相关的所有事务,如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等;
T:代表模板(Template),即表现层,该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示;
V:代表视图(Views),即业务逻辑层,该层包含存取模型及调取恰当模板的相关逻辑,可以看作模型和模板之间的桥梁。