在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 03 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
python绘制中国大陆人口热力图
Nov 07 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
django页面跳转问题及注意事项
Jul 18 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
Python字符串及文本模式方法详解
Sep 10 Python
Python常用扩展插件使用教程解析
Nov 02 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
Python的logging模块基本用法
Dec 24 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
加速XP搜索功能堪比vista
2007/03/22 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
php上传大文件设置方法
2016/04/14 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
PHP 无限级分类
2017/05/04 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
对比分析json及XML
2014/11/28 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
Python语言快速上手学习方法
2018/12/14 Python
Python单元测试与测试用例简析
2019/11/09 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
医药专业推荐信
2013/11/15 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
校园活动策划方案
2014/06/13 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python