Создание сайта на 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_dateDateTimeField. Существуют и другие типы полей, подробнее о них можно прочитать в документации DjangoCharField является простейшим символьным типом. В данном случае он будет хранить текст вопроса. В скобках задаются аргументы, которые используются для валидации данных при вводе и сохранении.  Например, аргумент 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 __future__ import unicode_literals

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"));
INSERT INTO "polls_choice" ("votes", "choice_text", "question_id", "id") SELECT "votes", "choice_text", NULL, "id" 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.

Пока все!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *