在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 14 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
浅谈Django学习migrate和makemigrations的差别
Jan 18 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
opencv python图像梯度实例详解
Feb 04 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
Python实战之实现康威生命游戏
Apr 26 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
javascript处理table表格的代码
2010/12/06 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
几种tab切换详解
2017/02/03 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
js实现随机点名
2021/01/19 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python学习教程之使用py2exe打包
2017/09/24 Python
Python中协程用法代码详解
2018/02/10 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
监理员的岗位职责
2013/11/13 职场文书
德育标兵事迹材料
2014/08/24 职场文书
新课培训心得体会
2014/09/03 职场文书
公司车队管理制度
2015/08/04 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server