Хостинг Django от «Джино»
Table of contents

Установка модели

Мы написали код. Давайте создадим таблицы в нашей базе данных. Чтобы это сделать мы должны активировать модели в нашем проекте. Это делается с помощью добавления приложения books к списку установленных приложений в файле параметров.

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

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
)

Временно закомментируйте все четыре строки с помощью символа #. (Эти приложения были активированы для удобства, но мы самостоятельно активируем и обсудим их позже.) Не закрывая файл, измените параметры MIDDLEWARE_CLASSES и TEMPLATE_CONTEXT_PROCESSORS. Эти параметры зависели от приложений, которые мы закомментировали. Теперь добавьте mysite.books в список INSTALLED_APPS:

MIDDLEWARE_CLASSES = (
#    'django.middleware.common.CommonMiddleware',
#    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

INSTALLED_APPS = (
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.sites',
    'mysite.books',
)

(Раз мы здесь работаем с одно-элементным кортежем, не забудьте о завершающей запятой. Между прочим, авторы этой книги предпочитают ставить запятую после каждого элемента в кортеже, независимо от того, что кортеж имеет единственный элемент. Это помогает избежать проблемы забытых запятых и никак не влияет на производительность.)

Элемент mysite.books ссылается на приложение books, над которым мы работаем. Каждое приложение, перечисленное в INSTALLED_APPS, представлено полным путём к нему — он, путь к пакетам, разделён точками.

После того как приложение было активировано в файле конфигурации проекта, мы можем создать таблицы в нашей базе данных. Сначала, давайте проверим модели с помощью команды:

python manage.py validate

Команда validate проверяет корректность синтаксиса и логики моделей. Если всё в порядке, вы увидите сообщение «0 errors found». Если нет, удостоверьтесь, что вы корректно набрали код модели. Вывод ошибки должен дать вам полезную информацию об ошибке в коде.

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

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

python manage.py sqlall books

В данной команде books является именем приложения. Это имя вы указывали при выполнении команды manage.py startapp. После запуска команды вы должны увидеть нечто подобное:

BEGIN;
CREATE TABLE "books_publisher" (
    "id" serial 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_book" (
    "id" serial NOT NULL PRIMARY KEY,
    "title" varchar(100) NOT NULL,
    "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id"),
    "publication_date" date NOT NULL
);
CREATE TABLE "books_author" (
    "id" serial NOT NULL PRIMARY KEY,
    "salutation" varchar(10) NOT NULL,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(40) NOT NULL,
    "email" varchar(75) NOT NULL,
    "headshot" varchar(100) NOT NULL
);
CREATE TABLE "books_book_authors" (
    "id" serial NOT NULL PRIMARY KEY,
    "book_id" integer NOT NULL REFERENCES "books_book" ("id"),
    "author_id" integer NOT NULL REFERENCES "books_author" ("id"),
    UNIQUE ("book_id", "author_id")
);
CREATE INDEX books_book_publisher_id ON "books_book" ("publisher_id");
COMMIT;

Отметим следующее:

  • Имена таблиц генерируются автоматически, комбинируется имя приложения (books) и имя модели в нижнем регистре (publisher, book и author). Вы можете изменить это поведение, подробности смотрите в приложении «Справочник определений модели».

  • Как мы уже упоминали, Django автоматически добавляет первичный ключ для каждой таблицы — поле id. Вы можете изменить и это.

  • По правилу Django добавляет «_id» к имени поля внешнего ключа. Как вы можете предположить, вы можете изменить и это поведение.

  • Привязка внешнего ключа явно определяется с помощью оператора REFERENCES.

  • Операторы CREATE TABLE адаптируются к используемой базе данных, таким образом специфичные типы полей, такие как auto_increment (MySQL), serial (PostgreSQL) или integer primary key (SQLite) обрабатываются автоматически. То же самое происходит с экранированием имён полей (т.е., используются двойные или одинарные кавычки). В данном примере приведён синтаксис для PostgreSQL.

Команда sqlall не создаёт таблицы и никак не воздействует на базу данных — она просто выводит SQL операторы на экран и вы можете посмотреть, что будет передано в базу данных. Если вы пожелаете, можно вручную скопировать эти операторы в командную строку клиента базы данных или перенаправить данные в клиент напрямую. Тем не менее, Django предоставляет простой способ выполнения SQL в базе данных. Выполните команду syncdb:

python manage.py syncdb

Вы увидите подобное:

Creating table books_publisher
Creating table books_book
Creating table books_author
Installing index for books.Book model

Команда syncdb просто синхронизирует ваши модели в базе данных. Она просматривает все модели каждого приложения, указанного в параметре INSTALLED_APPS, проверяет наличие соответствующих таблиц в базе данных и по необходимости создаёт их. Следует отметить, что syncdb не синхронизирует изменения в моделях или удаления моделей. Если вы изменили модель или удалили её, то команда syncdb не поможет с внесением изменений в базу. (More on this in the “Making Changes to a Database Schema” section toward the end of this chapter. FIXME)

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

Если вам интересно, то изучите подробнее клиент вашей базы данных и просмотрите созданную базу данных. Вы можете вручную запустить клиент (т.е., psql для PostgreSQL) или вы можете применить команду python manage.py dbshell, которая запускает клиент, используя параметр DATABASE_ENGINE. Последний вариант более удобен.

alerion 1 month, 4 weeks ago
Answer Link

reply to Kallen92
Выдает ошибку ''django doesent know which syntax to use foryour SQL statments because you hevent specified the DATABASE_ENGINE setting ''. как мне настроить setting.py работаю в XP встрял страшно кто знает как настроить ?

Вопросы - на форум.

Kallen92 1 month, 4 weeks ago
Answer Link

Выдает ошибку ''django doesent know which syntax to use foryour SQL statments because you hevent specified the DATABASE_ENGINE setting ''. как мне настроить setting.py работаю в XP встрял страшно кто знает как настроить ?

alerion 4 months ago
Answer Link

reply to Nail
Ссылка Доступ к данным http://djbook.ru/ch05s08.html не работает. Выдает ошибку 502 Bad Gateway

Сервер глючил

Nail 4 months ago
Answer Link

Ссылка Доступ к данным http://djbook.ru/ch05s08.html не работает. Выдает ошибку 502 Bad Gateway

alerion 8 months, 3 weeks ago
Answer Link

> у меня вообще что то пишит про ерор майскьюэль...... ((((

Можете раскрыто описать проблему на форуме и возможно вам помогут.

roomantix 8 months, 3 weeks ago
Answer Link

у меня вообще что то пишит про ерор майскьюэль...... ((((

alerion 9 months, 1 week ago
Answer Link

А может проще скачать то, что просит? Я думаю хотело PIL. К тому же вам даже ссылку показали.

sintsov.denis 9 months, 2 weeks ago
Answer Link

Насчет записи в модели: headshot = models.ImageField(upload_to='/tmp'). При проверки на правильность синтаксиса модели (validate) выдает ошибку, что чего-то нахватает, дает ссылку и просит скачать. Пришлось просто задокументировать эту часть кода.

Может подправите документ, убрав этот код из учебника или предупредите, что требуется что-то скачать для корректной работы. Некоторые новички могут и не догадаться в чем дело.


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5