在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 字符串和日期之间转换 StringAndDate
May 04 Python
深入理解Python分布式爬虫原理
Nov 23 Python
VTK与Python实现机械臂三维模型可视化详解
Dec 13 Python
python使用itchat实现手机控制电脑
Feb 22 Python
python实现人民币大写转换
Jun 20 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
简单了解python反射机制的一些知识
Jul 13 Python
PyTorch预训练的实现
Sep 18 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
Python如何根据时间序列数据作图
May 12 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
提高php编程效率技巧
2015/08/13 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
YII框架常用技巧总结
2019/04/27 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
python计算两个数的百分比方法
2018/06/29 Python
python实现超市商品销售管理系统
2019/10/25 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
体检通知范文
2015/04/21 职场文书
红歌会主持词
2015/07/02 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS