Фреймворк имеет в составе собственную консоль Django (редакция консоли Python Shell). Основное отличие – в пути поиска модулей автоматически добавляется каталог проекта, из которого данная консоль была запущена.
Для запуска консоли необходимо выполнить команду:
manage.py shell
В случае успешного запуска отобразится приглашение >>>, которое предлагает ввести команду на языке Python и получить результат.
Использует данный инструмент для создания первого объявления (модель Bb).
>>> from bboard.models import Bb >>> b1 = Bb(title='Продается дача', content='Общество "Маяк". ' + \ 'Два этажа, стены кирпич, газ, свет.', price=600000)
Запись модели осуществляется аналогично работе любого другого класса – через вызов конструктора. Значение нужных полей можно передать через именнованные параметры.
При создании новой записи данным методом сохранение в базу данных не происходит – данные хранятся в ОЗУ. Сохранение осуществляется при вызове метода save() без указания параметров.
>>> b1.save()
Для проверки можно попытаться получить значение ключевого поля:
>>> b1.pk 1
Атрибут класса pk присутствует у всех моделей и содержит ключевые поля. Получить его значение можно только после добавления записи в базу данных.
Аналогично можно обратиться к любому полю записи, указав соответствующий атрибут:
>>> b1.title 'Продается дача'
Можно сначала создать запись без данных, вызвав конструктор класса без параметров, а все поля добавить позднее:
>>> b2 = Bb() >>> b2.title = 'Земельный участок' >>> b2.content = '4 сотки' >>> b2.save() >>> b2.pk 2
Все классы моделей также имеют поддержку атрибута класса object, который хранит диспетчер записей. Данный объект является экземпляром класса Manager и содержит все записи текущей модели.
Метод create() диспетчера позволяет быстро создать новую запись, принимая значения полей в виде именованных параметров. При этом сразу происходит сохранение новой записи и возвращение ее в качестве результата.
Выведем заголовки и соответствующие ключи всех объявлений модели Bb:
>>> for x in Bb.objects.all(): print(x.pk, ': ', x.title) 1: Продается дача 2: Автомобиль
У диспетчера записей присутствует метод all(), который возвращает набор записей – последовательность содержит все записи модели, которые можно обработать при помощи стандартного цикла. Набор записей – экземпляр класса QuerySet, отдельные записи представляются экземплярами класса соответствующей модели.
Отсортируем записи по заголовку:
>>> for x in Bb.objects.order_by ('title'): print(x.pk, ': ', x.title) 1: Автомобиль 2: Продается дача
Метод order_by() сортирует полученный набор записей (поле сортировки указывается в параметре), возвращая отсортированный набор данных.
Метод filter() позволяет отфильтровать записи по определенным критериям. К примеру, чтобы набор содержал только записи, в которых определенное поле (например, заголовок) содержит указанное значение. Вызов метода возвращает другой диспетчер записей, который содержит только записи, удовлетворяющие условию фильтрации.
В качестве примера найдем объявление, которое имеет ключ 3:
>>> i = Bb.objects.get(pk=3) >>> i.title 'Стиральная машинка'
Для поиска объявлений также можно воспользоваться методом get(), который имеет аналогичный метод вызова, однако возвращает только первую найденную запись.
Для удаления записей служит метод delete(), который возвращает количество удаленных записей.
Для выхода из консоли необходимо воспользоваться командой exit().
Вернемся к контролеру и сделаем так, чтобы он выводил список всех объявлений с сортировкой по дате публикации.
Откроем для редактирования модуль views.py (приложение bboard) и изменим код:
from django.http imort HttpResponse from .models import Bb def index(request): s = 'Объявления\r\n\r\n' for bb in Bb.objects.order_by('-published'): s += bb.title + '\r\n' + bb.content + '\r\n\r\n' return HttpResponse(s, content_type='text/plain; charset=utf-8')
Чтобы объявления сортировались по убыванию мы перед именем поля published добавили знак ‘-‘. Список объявлений выводится как обычный текст, для разбивки на строки используются служебные символы \r\n.
За отправку ответа клиента отвечает экземпляр класса HttpResponse, в котором при помощи именованного параметра content_type указали тип данных: обычный текст в кодировке UTF-8. Без указания кодировки браузер может некорректно отобразить данные.
Таким образом можно сформировать и полноценную HTML-страницу, отобразив соответствующий код. Однако удобнее использовать специальные шаблоны.