Знакомство с django, Работа с БД.
На Хабре существует много тем о django, с описанием различных вкусностей. Но мне не встречался пост, про начало пути, так сказать для новичка. Так что хочется написать короткое руководство начинающего бойца, по собственным шагам.
Cпасибо www.djbook.ru, русский перевод онлайн книги о django, именно отсюда я черпал данные для написания поста.
Далее по тексту я попытаюсь кратко описать общие сведения необходимые для работы с БД в django.
Начну с перечисления приложений с которыми я работал:
- python 2.6
- django 1.1.1
- postgreSQL 8.4.2
- python-psycopg2 2.0.8-0
здесь ссылка на то как установить django
Поскольку это описание собственного опыта, буду описывать всё по шагам, как делал я.
Первым шаг. Создание проекта
Для начала, нужно создать новый проект. Для этого нужно определиться с именем каталога проекта и местом его расположения. В выбранном каталоге выполним команду:
django-admin.py startproject hellowDjango
Данное действие приведёт к созданию шаблона нового проекта под названием hellowDjango. Подробнее о том, что происходит при выполнении команды можно прочитать здесь. Проект создан и пора переходить к следующему шагу.
Второй шаг, Настройка БД
Django может работать с множеством БД, но в данном примере я использую postgresql.
Я предполагаю, что БД у вас уже установлена и настроена. Если нет, то вот ссылка, которая помогла мне настроить мою БД на Ubuntu. Открываем файл настроек, settings.py находящийся в каталоге проекта hellowDjango, находим там такие строчки и модифицируем их до:
DATABASE_ENGINE = 'postgresql_psycopg2' #'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = myDBName # Or path to database file if using sqlite3.
DATABASE_USER = myUserDB # Not used with sqlite3.
DATABASE_PASSWORD = myUserDBPasswor # Not used with sqlite3.
На всякий случай поясню:
- 'postgresql_psycopg2' — драйвер через который приложение будет выполнять запросы к БД и получать данные;
- myDBName — название БД;
- myUserDB — основной пользователь БД;
- myUserDBPasswor — пароль основного пользователя.
Теперь необходимо проверить, что всё настроено правильно, для этого нужно выполнить команду в каталоге проекта:
python manage.py shell
Данная команда запустит интерпретатор python с настройками проекта. В интерпретаторе проверим подключение к БД.
>>> from django.db import connection
>>> cursor = connection.cursor()
В случае ошибки в настройках, появится сообщение которое поможет внести нужные исправления.
Третий шаг, Создание приложения.
Приложение в django — набор модели БД и представления хранящиеся в одном пакете python. Для того что бы, создать приложение, необходимо находясь в каталоге проекта выполнить команду:
python manage.py startapp MyName
Эта команда создаст директорию MyName, в каталоге проекта hellowDjango, а так же создаст файлы «заготовки» приложения в каталоге MyName.
Четвёртый шаг, Описание модели.
Модель БД в django — описание таблиц на языке python. Для создания модели приложения необходимо отредактировать файл MyName/models.py. В модели описывается много классов, каждый из которых будет описывать одну таблицу БД, а свойство класса — это один столбец таблицы. Класс должен быть унаследован от models.Model описанного в пакете django.db.models. Свойства класса должны иметь типы описанные в пакете django.db.models. Все типы данных и их применение описаны здесь.
Я в своих целях использовал следующие типы данных:
- models.DateTimeField() — поле содержащее в себе Дату и Время
- models.CharField(max_length= xx) — Текстовое поле ограниченной длины. Длина строки = xx символов
- models.BooleanField() — Поле содержащие в себе булево значение
- models.ForeignKey() — ссылка на внешнюю таблицу
- models.PositiveIntegerField() — положительное целое значение
- models.URLField(max_length=хх) — ссылка на web страницу длина ссылки ограничена xx символами
- models.DateField() — поле содержащие Дату
При создании модели данных у меня возникла проблема с внешними ключами. При ссылке на внешнюю таблицу которая описывалась ниже происходила ошибка. Перестановка таблиц решила данную проблему. Отмечу, что при создании внешних ключей, django добавляет к имени поля с внешним ключом постфикс _id.
Для проверки корректности созданной модели необходимо выполнить команду:
python manage.py validate
После того как модель прошла проверку, можно посмотреть как django предложит сгенерировать таблицы. Для этого выполним ещё одну команду:
python manage.py sqlall MyName
Для создания модели в БД, выполним следующую команду:
python manage.py syncdb
Пятый шаг. Работа с БД в интерпретаторе.
Ниже представлены варианты вставки данных в БД
Запускаем интерпретатор
python manage.py shell
>>> import MyName.models as mo # импортируем все модели проекта
>>> type = mo.ProductClass() # создаём экземпляр класса Типы Продуктов
>>> type.class_name = 'сырьё' # название типа
>>> type.save() # записываем экземпляр в БД
>>> type
< ProductClass: ProductClass object>
# так же можно воспользоваться вставкой данных другого вида
>>> mo.Dealer(organization_name = "ООО Рога И Копыта").save() # создаст запись в таблице Dealer
>>> mo.Dealer.objects.all() # выполняем выборку данных из таблицы Dealer
[< Dealer: ООО Рога И Копыта>] # поскольку запись в таблице только 1 то и коллекция содержит всего 1 элемент, обратиться к нему можно через индексы.
# если для создания записи будет не хватать каких либо данных вы уведите протокол ошибки. Например такой:
>>> mo.Product(name = 'овёс', price = 50, product_class = type).save()
Traceback (most recent call last):
...
IntegrityError: null value in column "diler_id" violates not-null constraint
>>> mo.Product(name = 'овёс', price = 50, product_class = type, diler = mo.Dealer.objects.all()[0]).save() # вторая запись в таблице Product
Теперь нужно поговорить о выборе данных из таблиц.
# полная выборка из таблицы
>>> mo.Product.objects.all()
[< Product: мука>, < Product: овёс>, < Product: рожь>]
# выборка по полю name
>>> mo.Product.objects.filter(name = 'овёс')
[< Product: овёс>]
# выборка по частичному совпадению
>>> mo.Product.objects.filter(name__contains = 'о')
[< Product: овёс>, < Product: рожь>]
Мы рассмотрели вставку и выборку данных.
Давайте рассмотрим варианты обновления записей.
# для того что бы провести обновление записи необходимо выполнить следующие действия
>>> item2 = mo.Product.objects.get(name = 'овёс')
>>> item2.name = "овёс золотистый"
>>> item2.save()
Данный пример прост но имеет свой недостаток, он выполняет обновление всех полей записи, а не только тех которые изменились. Данный факт может привести к «гонке» пользователей, когда происходит массовое изменение данных в Таблице. Для решения такой проблемы правильно будет использовать метод update. Данный метод изменяет только указанные поля.
>>> mo.Product.objects.filter(id=3).update(name='oves')
1
>>> cole[2]
< Product: oves>
Последнее, что хочется описать, это удаление записей из БД.
Существует два способа удаления записей:
Первый удаление всех данных из таблицы
>>> cm.Dealer.objects.all()
[< Dealer: ООО Рога И Копыта>]
>>> cm.Dealer.objects.all().delete()
>>> cm.Dealer.objects.all()
[]
Второй удаление отобранных записей
>>> cm.ProductClass.objects.all()[0].id
1
>>> cm.ProductClass.objects.filter(id=1).delete()
>>> cm.ProductClass.objects.all()
[]
Более подробно о всех командах api работы с БД и можно почитать здесь.
Вот краткое описание возможностей работы с БД в django, надеюсь данная информация будет полезна.
Немного более развёнутую статью можно прочитать у меня в блоге