Создание сайта на Python/Django: создание моделей
После создания базы данных сайта на Django переходим к созданию моделей. Если вы по какой-то причине решили отказаться от самостоятельного создания сайта, то всегда можно обратиться к профессионалам. Например, вот тут вам помогут создать продающий Landing page для вашего товара без лишних заморочек и вы получите качественный результат быстро. Если же все же есть интерес делать сайт самому, то продолжаем создание сайта на Django.
И так, модель. Фактически, модель это макет данных для хранения в базе данных. Модель задает поля данных, их тип и взаимосвязь между ними. Цель создания модели – это хранение структуры данных в одном месте и обеспечение легкости извлечения и изменения структуры данных. На основе модели данных создаются так называемые миграции, которые содержат историю изменения структуры данных и служат для внесения соответствующих изменений в реальную базу данных.
Первые поля модели данных Django приложения
Создадим в нашем приложении две модели под названием Question и Choice. Для этого в файле polls/models.py создадим следующий код:
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
Не сложно понять, что каждый класс характеризует отдельную модель данных. Каждая модель может содержать несколько полей, которые будут соотвествовать реальным полям в базе данных.
Типы полей данных
Для каждого поля задается его тип. Так, например, поле question_text определено типом CharField, а pub_date – DateTimeField. Существуют и другие типы полей, подробнее о них можно прочитать в документации Django. CharField является простейшим символьным типом. В данном случае он будет хранить текст вопроса. В скобках задаются аргументы, которые используются для валидации данных при вводе и сохранении. Например, аргумент max_length задает ограничение по длине. Для поля CharField этот аргумент является обязательным. Существуют так же и необязательные аргументы. В приведенном коде таким является default поля votes типа IntegerField. Данный аргумент задает значение по-умолчанию. Здесь оно задано, т.к. нам необходимо установить начальное значение поля при создании опроса и введении вариантов ответа. Логично, что пока никто не проголосовал, ответов будет 0.
Отдельного внимания стоит поле ForeignKey. Данное поле отвечает за взаимосвязь полей модели Choice с полями модели Question. Данное поле определяет какие варианты ответов из таблицы Choice соответствуют вопросу из таблицы Question. Аргумент on_delete=models.CASCADE устанавливает правило удаления и необходим, что бы в случае удаления вопроса, были удалены так же варианты ответов на него из соответствующей таблицы в базе данных.
Создание миграции и активация модели
Свою первую модель в приложении мы создали. Теперь стоит задача создать миграцию. Говоря проще, миграция – это файл, содержащий инструкции по реализации модели данных. Как выглядит файл миграции увидим немного позже, после того как его создадим.
Прежде чем перейти к созданию миграции нам необходимо сообщить Django, что у нас в проекте появилось новое приложение, модели которого так же необходимо будет обработать. Для этого в файле mysite/settings.py необходимо найти после INSTALLED_APPS и добавить polls.apps.PollsConfig. Результат должен выглядеть как-то так:
INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
Теперь Django знает, что в нашем проекте есть приложение polls и мы можем запустить команду, которая создаст миграцию на основе модели, созданной ранее.
python manage.py makemigrations polls
В результате выполнения команды мы должны увидеть что-то такое:
Migrations for 'polls': polls\migrations\0001_initial.py - Create model Choice - Create model Question - Add field question to choice
Файл миграции создан. Давайте взглянем на него.
from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Choice', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('choice_text', models.CharField(max_length=200)), ('votes', models.IntegerField(default=0)), ], ), migrations.CreateModel( name='Question', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('question_text', models.CharField(max_length=200)), ('pub_date', models.DateTimeField(verbose_name='date published')), ], ), migrations.AddField( model_name='choice', name='question', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question'), ), ]
Как видим, созданные нами ранее классы, переменные и атрибуты превратились в списки операций, которые необходимо будет выполнить при активации миграции. Давайте выполним еще одну команду и увидим как будет выглядеть запрос к базе данных, построенный на основании данной миграции.
python manage.py sqlmigrate polls 0001
Сам запрос:
BEGIN; -- -- Create model Choice -- CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL); -- -- Create model Question -- CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL); -- -- Add field question to choice -- ALTER TABLE "polls_choice" RENAME TO "polls_choice__old"; CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED); INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELECT "id", "choice_text", "votes", NULL FROM "polls_choice__old"; DROP TABLE "polls_choice__old"; CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id"); COMMIT;
В этом запросе мы видим, что для каждой модели создается таблица, название которой генерируется на основании имени приложения и имени модели, а поля таблицы соответствуют тем переменным и типам, которые заданы в файле polls/models.py. Осталось выполнить последнюю команду, чтобы данные изменения были применены:
python manage.py migrate
Если все сделано верно, то мы должны увидеть примерно такой результат:
Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying polls.0001_initial... OK
Таким образом мы создали первую модель, на основании ее сгенерировали миграцию и затем ее применили. Теперь наша база данных содержит необходимые поля для хранения данных. В следующих статьях серии продолжим создавать приложение и перейдем к администрированию наших данных через Django Admin, а именно – создадим пользователя и реализуем возможность занесения, редактирования и удаления данных в базе данных. Увидим на сколько это легко и просто благодаря широким возможностям фреймворка Django. А пока читайте статью подбор хостинга для сайта на Python/Django.
Пока все!