Мы написали код. Давайте создадим таблицы в нашей базе данных. Чтобы это сделать мы должны активировать модели в нашем проекте. Это делается с помощью добавления приложения 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']. Последний вариант более
удобен.
| Пред. | Уровень выше | След. |
| Ваша первая модель | Начало | Доступ к данным |
18 комментариев | Оставьте комментарий
Насчет записи в модели: headshot = models.ImageField(upload_to='/tmp'). При проверки на правильность синтаксиса модели (validate) выдает ошибку, что чего-то нахватает, дает ссылку и просит скачать. Пришлось просто задокументировать эту часть кода.
Может подправите документ, убрав этот код из учебника или предупредите, что требуется что-то скачать для корректной работы. Некоторые новички могут и не догадаться в чем дело.
А может проще скачать то, что просит? Я думаю хотело PIL. К тому же вам даже ссылку показали.
у меня вообще что то пишит про ерор майскьюэль...... ((((
> у меня вообще что то пишит про ерор майскьюэль...... ((((
Можете раскрыто описать проблему на форуме и возможно вам помогут.
Ссылка Доступ к данным http://djbook.ru/ch05s08.html не работает. Выдает ошибку 502 Bad Gateway
Ответ на Nail
Ссылка Доступ к данным http://djbook.ru/ch05s08.html не работает. Выдает ошибку 502 Bad Gateway
Сервер глючил
Выдает ошибку ''django doesent know which syntax to use foryour SQL statments because you hevent specified the DATABASE_ENGINE setting ''. как мне настроить setting.py работаю в XP встрял страшно кто знает как настроить ?
Ответ на Kallen92
Выдает ошибку ''django doesent know which syntax to use foryour SQL statments because you hevent specified the DATABASE_ENGINE setting ''. как мне настроить setting.py работаю в XP встрял страшно кто знает как настроить ?
Вопросы - на форум.
огромное спасибо за существование этих статей и сайта!
у кого такая ошибка:
Error: One or more models did not validate:
books.author: "headshot": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .
решение - скачать соответствующий PIL с http://www.lfd.uci.edu/~gohlke/pythonlibs/
Из сайта, который указан в ошибке, качать не рекомендуется.
Непонятно, почему авторы этого сайта не знают как решить проблему!
команда "python manage.py syncdb" очень "вовремя" приведена! её нужно выполнить ещё перед ">>> from django.db import connection >>> cursor = connection.cursor()", иначе две последние команды дают ошибку!
Ответ на max143
у кого такая ошибка:
Error: One or more models did not validate:
books.author: "headshot": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .
решение - скачать соответствующий PIL с http://www.lfd.uci.edu/~gohlke/pythonlibs/
Из сайта, который указан в ошибке, качать не рекомендуется.
Непонятно, почему авторы этого сайта не знают как решить проблему!
Вопросы задавайте на форуме.
Ответ на alerion
Вопросы задавайте на форуме.
Уважаемый, alerion, Вы прочитали комментарий? Это не вопрос, я предложил решение проблемы!
/mysite$ python manage.py runserver
Error: No module named books
Что делать, сделать всё как здесь написано , 5 раз переделывал всё заново и нифига
Ответ на duke5650
/mysite$ python manage.py runserver
Error: No module named books
Что делать, сделать всё как здесь написано , 5 раз переделывал всё заново и нифига
Напишите так:
INSTALLED_APPS = (
'books',
)
возникла ошибка "django doesent know which syntax to use foryour SQL statments because you hevent specified the DATABASE_ENGINE setting" решил переводом кортежа "DATABASES = {" в простые переменные. Что сранно, но все команды кроме syncdb ипользуют обычные переменные вроде DATABASE_ENGINE='django.db.backends.mysql' а не кортеж DATABASES
Django 2.0
Error:
__init__() missing 1 required argument 'on_delete'
solution:
https://www.valentinog.com/blog/django-missing-argument-on-delete/
Ошибка для sqlall и validate также связана с версией Django.
Решение есть по ссылке:
https://www.digitalocean.com/community/tutorials/how-to-create-django-models