Модели Django
В главе 3 мы рассмотрели основы построения динамических веб-сайтов с помощью Django: создание представлений и настройку шаблонов URL. Мы сказали, что представление может реализовывать произвольную логику и должно вернуть ответ. В качестве одного из примеров такой произвольной логики мы привели вычисление текущих даты и времени.
Логика современных веб-приложений часто требует обращения к базе данных. Такой управляемый данными сайт подключается к серверу базы данных, получает от него данные и отображает их на странице. Некоторые сайты позволяют посетителям пополнять базу данных.
Многие развитые сайты сочетают обе возможности. Например, Amazon, com - прекрасный пример сайта, управляемого данными. Страница каждого продукта представляет собой результат запроса к базе данных Amazon, отформатированный в виде HTML. А отправленный вами отзыв сохраняется в базе данных.
Django отлично подходит для создания управляемых данными сайтов, поскольку включает простые и вместе с тем мощные средства для выполнения запросов к базе данных из программы на языке Python. В этой главе мы будем рассматривать именно эту функциональность - уровень доступа к базе данных в Django.
Примечание ———————————————————————-
Для использования уровня доступа к базе данных в Django знакомство с теорией реляционных баз данных и языком SQL, строго говоря, необязательно, однако настоятельно рекомендуется. Введение в тематику баз данных выходит за рамки настоящей книги, но не бросайте чтение, даже если вы новичок в этой области. Вы сумеете ухватить суть, опираясь на контекст.
Прямолинейный способ обращения к базе данных из представления
В главе 3 был описан непосредственный способ генерации выходной информации в представлении (путем включения текста прямо в код функции). Точно так же существует непосредственный способ обращения к базе данных из представления. Достаточно воспользоваться любой из существующих библиотек на Python, которые позволяют выполнить SQL-запрос и что-то сделать с полученным результатом.
В следующем примере мы воспользовались библиотекой MySQLdb (ее можно загрузить со страницы http://www.djangoproject.eom/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.executeC 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-команды - быть может, переписать запрос. В идеале СУБД должна быть абстрагирована, так чтобы при смене СУБД было достаточно внести изменение в одно место. (Это особенно желательно, когда вы пишете на 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})
Далее мы подробно объясним, как действует этот код. А пока просто полюбуйтесь на него.
Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.