在Django的视图中使用数据库查询的方法


Posted in Python onJuly 16, 2015

在视图中也有笨方法可以从数据库中获取数据。 很简单: 用现有的任何 Python 类库执行一条 SQL 查询并对结果进行一些处理。

在本例的视图中,我们使用了 MySQLdb 类库(可以从 http://www.djangoproject.com/r/python-mysql/ 获得)来连接 MySQL 数据库,取回一些记录,将它们提供给模板以显示一个网页:

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('SELECT 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数据库层正是致力于解决这些问题。 以下提前揭示了如何使用 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})

我们将在本章稍后的地方解释这段代码。 目前而言,仅需对它有个大致的认识。

Python 相关文章推荐
用实例解释Python中的继承和多态的概念
Apr 27 Python
Python中的自省(反射)详解
Jun 02 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
pycharm设置注释颜色的方法
May 23 Python
python实现随机漫步算法
Aug 27 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
python实现批量注册网站用户的示例
Feb 22 Python
pyqt5 删除layout中的所有widget方法
Jun 25 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
python中函数返回多个结果的实例方法
Dec 16 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
详解Python的Django框架中的模版继承
Jul 16 #Python
Django中模版的子目录与include标签的使用方法
Jul 16 #Python
Django中使用locals()函数的技巧
Jul 16 #Python
Django框架中render_to_response()函数的使用方法
Jul 16 #Python
在Python的Django框架中加载模版的方法
Jul 16 #Python
Django框架下在视图中使用模版的方法
Jul 16 #Python
详解Django中的过滤器
Jul 16 #Python
You might like
php加密解密实用类分享
2014/01/07 PHP
php获取文件大小的方法
2014/02/26 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
python实现从字典中删除元素的方法
2015/05/04 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
python分析作业提交情况
2017/11/22 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python实现归并排序算法
2018/11/22 Python
更新修改后的Python模块方法
2019/03/03 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
Python os库常用操作代码汇总
2020/11/03 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
建筑施工安全责任书
2014/07/24 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
JavaScript实现音乐播放器
2022/08/14 Javascript