在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循环语句之break与continue的用法
Oct 14 Python
python 实现红包随机生成算法的简单实例
Jan 04 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
Sanic框架安装与简单入门示例
Jul 16 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
Python上下文管理器全实例详解
Nov 12 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Python tkinter实现简单加法计算器代码实例
May 13 Python
keras打印loss对权重的导数方式
Jun 10 Python
Python之多进程与多线程的使用
Feb 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数组函数
2008/08/18 PHP
提高PHP编程效率的方法
2013/11/07 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
js 学习笔记(三)
2009/12/29 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
介绍Python中几个常用的类方法
2015/04/08 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
学Python 3的理由和必要性
2019/11/19 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
Python requests接口测试实现代码
2020/09/08 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
什么是规则表达式
2012/05/03 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
会计主管岗位职责范文
2013/11/08 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
生日宴会主持词
2014/03/20 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
2015大学生实训报告
2014/11/05 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL