Django book: установка модели

By | 03/01/2015
 

django_logo_2Предыдущая часть.

Мы написали код, теперь время создать таблицы в нашей базе данных. Что бы сделать это – сначала на “активировать” наши модули в нашем Django-проекте. Мы сделаем это, добавив приложение books в список установленных приложений в файле настроек.

Откройте файл settings.py в редакторе и найдите опцию INSTALLED_APPS. Она указывает Django, какие приложения активны в данном проекте. По умолчанию она будет выглядеть примерно так:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

Пока что – закомментируйте все приложения в этом списке, указав символ # в начале строки (они включены по умолчанию, для удобства использования Django, но мы активируем и обсудим их в следующих главах). Когда вы это сделаете – закомментируйте так же настройки в MIDDLEWARE_CLASSES – значения там зависят от некоторых приложений, которые мы только что закомментировали. Затем – добавьте ‘books‘ в список INSTALLED_APPS, что бы настройки выглядели примерно так:

MIDDLEWARE_CLASSES = (
#    'django.middleware.common.CommonMiddleware',
#    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.middleware.csrf.CsrfViewMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
#    'django.contrib.messages.middleware.MessageMiddleware',
)
INSTALLED_APPS = (
#    'django.contrib.auth',
#    'django.contrib.contenttypes',
#    'django.contrib.sessions',
#    'django.contrib.sites',
#    'django.contrib.messages',
#    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'books',
)

(Как мы уже упоминали в предыдущей главе – убедитесь, что добавили закрывающую запятую в INSTALLED_APPS, так как это кортеж с одним элементом. Кстати, авторы этой книги предпочитают указывать запятую после каждого элемента в кортеже, незаивисмо от того – содержится ли в кортеже один или несколько элементов. Это помогает избежать проблем с “забытыми” запятыми.)

books‘ указывает на приложение, над которым мы работаем. Каждое приложение в INSTALLED_APPS представлено полным путём в стиле Python – т.е., путь указывается с помощью точек, и ведёт к пакету с приложением.

Теперь, когда приложение активировано в файле настроек, мы можем создать таблицы в базе данных. Для начала – давайте проверим корректность наших моделей, выполнив команду:

$ python manage.py validate
0 errors found

Команда validate  проверяем синтаксис и логику ваших моделей. Если будут обнаружены ошибки – будет выведена полная трассировка выполнения, которая поможет её обнаружить.

Каждый раз, когда вы подозреваете наличие ошибки в ваших моделях – используйте python manage.py validate, что бы её обнаружить.

Если с вашими моделями всё в порядке – выполните следующую команду, что бы сгенерировать запрос CREATE TABLE для ваших моделей в приложении books:

$ python manage.py sqlall books

В этой команде books – имя вашего приложения. Когда вы выполните её – вы должны увидеть что-то вроде такого:

BEGIN;
CREATE TABLE `books_publisher` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` varchar(30) NOT NULL,
    `address` varchar(50) NOT NULL,
    `city` varchar(60) NOT NULL,
    `state_province` varchar(30) NOT NULL,
    `country` varchar(50) NOT NULL,
    `website` varchar(200) NOT NULL
)
;
CREATE TABLE `books_author` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `first_name` varchar(30) NOT NULL,
    `last_name` varchar(40) NOT NULL,
    `email` varchar(75) NOT NULL
)
;
CREATE TABLE `books_book_authors` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `book_id` integer NOT NULL,
    `author_id` integer NOT NULL,
    UNIQUE (`book_id`, `author_id`)
)
;
ALTER TABLE `books_book_authors` ADD CONSTRAINT `author_id_refs_id_9e7e386` FOREIGN KEY (`author_id`) REFERENCES `books_author` (`id`);
CREATE TABLE `books_book` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `title` varchar(100) NOT NULL,
    `publisher_id` integer NOT NULL,
    `publication_date` date NOT NULL
)
;
ALTER TABLE `books_book` ADD CONSTRAINT `publisher_id_refs_id_c5b274bb` FOREIGN KEY (`publisher_id`) REFERENCES `books_publisher` (`id`);
ALTER TABLE `books_book_authors` ADD CONSTRAINT `book_id_refs_id_cfbcf262` FOREIGN KEY (`book_id`) REFERENCES `books_book` (`id`);
CREATE INDEX `books_book_22dd9c39` ON `books_book` (`publisher_id`);
COMMIT;

Обратите внимание на такие моменты:

  • Имена таблиц генерируются автоматически из имени приложения (books) и имени модели (publisherbook и author). Вы можете изменить это, как описано в Приложении В.
  • Как уже упоминалось – Django создаёт первичный ключ для каждой таблицы автоматически, и это тоже можно изменить.
  • По умолчанию – Django добавляет “_id” к имени поля  foreign key. Как вы догадываетесь – это тоже настраивается.
  • Связи внешних ключей заданы явно, с помощью оператора REFERENCES.
  • Этот вызов CREATE TABLE создаётся с учётом используемого сервера баз данных, поэтому специфичные типы, такие как auto_increment (MySQL), serial (PostgreSQL) или integer primary key (SQLite) обрабатываются автоматически. То же касается и кавычек вокруг имён таблиц (например – использовать двойные или одинарные кавычки). Пример выше приведён для MySQL.

Команда sqlall не создаёт таблиц в базе данных – она только выводит SQL запрос, что бы вы могли проверить что именно Django будет делать с базой. Если вы хотите – вы можете скопировать и вставить этот запрос в SQL-клиент, или использовать Unix-pipe, что бы передать его напрямую (например – python manage.py sqlall books | mysql mydb). Однако, Django предоставляет более простой путь для выполнения этого запроса к базе: это команда syncdb:

$ python manage.py syncdb

Выполните её, и вы должны будете увидеть что-то вроде такого:

Creating tables ...
Creating table books_publisher
Creating table books_author
Creating table books_book_authors
Creating table books_book
Installing custom SQL ...
Installing indexes ...
No fixtures found.

Команда syncdb  просто “синхронизирует” ваши модели с базой данных. Она проверяет все модели во всех приложениях, которые указаны в параметре INSTALLED_APPS, проверяет базу на наличие таблиц, и создаёт их, если таблиц ещё нет. Помните, что syncdb  не выполняет синхронизацию изменений или удалений из моделей. Если вы изменили или удалили модель, и хотите обновить базу – syncdb не предназначена для этого (больше об этом мы поговорим в конце главы).

Если вы выполните python manage.py syncdb ещё раз – то ничего не произойдёт, потому что вы не добавлили никаких моделей в приложение books, и не добавили никаких прилождений в INSTALLED_APPS. Так что – вполне  безопасно запускать syncdb – она ничего не поломает.

Если вам интересно – то потратьте время, и посмотрите на созданные Django таблицы в базе:

MariaDB [django_example1]> show tables;
+---------------------------+
| Tables_in_django_example1 |
+---------------------------+
| books_author              |
| books_book                |
| books_book_authors        |
| books_publisher           |
+---------------------------+
MariaDB [django_example1]> desc books_author;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| first_name | varchar(30) | NO   |     | NULL    |                |
| last_name  | varchar(40) | NO   |     | NULL    |                |
| email      | varchar(75) | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

Вы можете подключиться к серверу баз данных вручную, через стандартный клиент, либо запустить python manage.py dbshell, которая определит подходящий клиент, в зависимости от настроек DATABASE_SERVER, и подключится с указанным пользователем, паролем, к указанной базе данных.

Продолжение – Django Book: основы доступа к данным.