在Django的视图中使用数据库查询的方法
在视图中也有笨方法可以从数据库中获取数据。很简单:用现有的任何Python类库执行一条SQL查询并对结果进行一些处理。
在本例的视图中,我们使用了MySQLdb类库(可以从http://www.djangoproject.com/r/python-mysql/获得)来连接MySQL数据库,取回一些记录,将它们提供给模板以显示一个网页:
fromdjango.shortcutsimportrender_to_response
importMySQLdb
defbook_list(request):
db=MySQLdb.connect(user='me',db='mydb',passwd='secret',host='localhost')
cursor=db.cursor()
cursor.execute('SELECTnameFROMbooksORDERBYname')
names=[row[0]forrowincursor.fetchall()]
db.close()
returnrender_to_response('book_list.html',{'names':names})
这个方法可用,但很快一些问题将出现在你面前:
我们将数据库连接参数硬行编码于代码之中。理想情况下,这些参数应当保存在Django配置中。
我们不得不重复同样的代码:创建数据库连接、创建数据库游标、执行某个语句、然后关闭数据库。理想情况下,我们所需要应该只是指定所需的结果。
它把我们栓死在MySQL之上。如果过段时间,我们要从MySQL换到PostgreSQL,就不得不使用不同的数据库适配器(例如psycopg而不是MySQLdb),改变连接参数,根据SQL语句的类型可能还要修改SQL。理想情况下,应对所使用的数据库服务器进行抽象,这样一来只在一处修改即可变换数据库服务器。(如果你正在建立一个开源的Django应用程序来尽可能让更多人使用的话,这个特性是非常适当的。)
正如你所期待的,Django数据库层正是致力于解决这些问题。以下提前揭示了如何使用Django数据库API重写之前那个视图。
fromdjango.shortcutsimportrender_to_response
frommysite.books.modelsimportBook
defbook_list(request):
books=Book.objects.order_by('name')
returnrender_to_response('book_list.html',{'books':books})
我们将在本章稍后的地方解释这段代码。目前而言,仅需对它有个大致的认识。
热门推荐
10 公司过年祝福语简短优美
11 订婚祝福语简短诗句
12 姓陈简短生日祝福语
13 简短深沉的生日祝福语
14 升学祝福语简短100个
15 开张祝福语简短小故事
16 新年祝福语创意简短霸气
17 早安朋友祝福语简短独特
18 拿到驾照的祝福语简短