Django — это известный веб-фреймворк для быстрой разработки безопасных и поддерживаемых веб-сайтов и веб-приложений. Созданный с использованием Python, Django упрощает веб-разработку, позволяя уделять больше времени и внимания написанию приложений, не изобретая велосипед каждый раз. Django — это бесплатный проект с открытым исходным кодом, надежной официальной документацией, отличной поддержкой сообщества и множеством бесплатных и платных вариантов поддержки.
В этом руководстве мы погрузимся в создание моделей Django. В Django модель является ключевым источником информации о ваших данных. Модели описывают поля и поведение сохраняемых данных. Django использует модель для генерации таблиц базы данных с помощью ORM (Object Relational Mapping), которые также называют моделями.
Предварительные требования
Мы работаем в операционной системе на базе Unix, предпочтительно облачном сервере Ubuntu 20.04 в качестве системы, на которой мы проводили тестирование. Если вы хотите настроить Django в аналогичной среде, обратитесь к нашему руководству «Как установить Django и настроить среду разработки на Ubuntu 20.04.”
Шаг 1. Среда разработки Python
Django построен на Python. Поэтому нам нужна надежная среда разработки Python со всеми необходимыми инструментами для работы с приложениями Python. Мы уже обсуждали это в специальном руководстве. Здесь мы проведем краткую демонстрацию.
Сначала запустите терминал и выполните следующие команды:
|
1 2 |
$ sudo apt update && sudo apt upgrade -y $ sudo apt install python3 python-is-python3 |
Затем установите pip – менеджер пакетов Python:
|
1 |
$ sudo apt install python3-pip |
Затем установите некоторые дополнительные пакеты для разработки:
|
1 |
$ sudo apt install build-essential libssl-dev libffi-dev python3-dev |
Для создания виртуального окружения нам также понадобится модуль Python venv :
|
1 |
$ sudo apt install python3-venv |
Шаг 2. Установка MySQL Server
MySQL — популярная реляционная система управления базами данных. Она имеет открытый исходный код, стабильна и богата функциями. Мы будем использовать MySQL в качестве сервера базы данных для нашего приложения Django. Установите MySQL с помощью APT:
|
1 |
$ sudo apt install mysql-server |
Затем проверьте установку:
|
1 |
$ systemctl status mysql |
Это всего лишь базовая настройка MySQL с параметрами по умолчанию. Ознакомьтесь с более подробным руководством по установке и настройке MySQL.
Шаг 3. Настройка приложения Django
Теперь мы готовы создать наше приложение Django. Если вас интересует более подробная демонстрация Django, обратитесь к нашему руководству «Установка веб-фреймворка Django на Ubuntu 20.04.”
Затем создайте специальный каталог для приложения. Имя каталога должно отражать имя проекта:
|
1 |
$ mkdir -pv <project_dir> |
В каталоге проекта создайте виртуальное окружение Python с помощью модуля venv :
|
1 |
$ python3 -m venv <virtual_env_name> |
Активируйте виртуальное окружение:
|
1 |
$ . sample_app_env/bin/activate |
Установите Django с помощью pip:
|
1 |
$ pip install django |
Затем создайте новый проект Django с помощью команды django-admin :
|
1 |
$ django-admin startproject sample_app |
Шаг 4. Настройка приложения Django
Приложение Django содержит все конфигурации по умолчанию. Для нашей цели нам нужно внести некоторые корректировки.
Начните с редактирования конфигурационного файла settings.py:
|
1 |
$ nano sample_app/sample_app/sample_app/settings.py |
Затем измените часовой пояс:
|
1 |
$ TIME_ZONE = '<time_zone>' |
Добавьте машины, которым разрешен доступ к серверу приложения Django:
|
1 |
$ ALLOWED_HOSTS = ['<allowed_host_ip_or_domain_name >'] |
После этого примените изменения:
|
1 |
$ python manage.py migrate |
Наконец, создайте суперпользователя для нашего веб-приложения Django:
|
1 |
$ python manage.py createsuperuser |
Шаг 5. Подключение приложения Django к MySQL
Чтобы подключиться к MySQL, нам понадобится дополнительная библиотека коннектора Python, совместимая с Django. Мы будем использовать mysqlclient.
Сначала убедитесь, что у нас установлены необходимые пакеты:
|
1 |
$ sudo apt install python3-dev libmysqlclient-dev default-libmysqlclient-dev |
Затем установите mysqlclient:
|
1 |
$ pip install mysqlclient |
- Создание выделенной базы данных
Для нашего приложения нам нужно создать выделенную базу данных и пользователя базы данных. Запустите оболочку MySQL от имени root:
|
1 |
$ sudo mysql -u root |
Создайте выделенную базу данных для нашего приложения Django:
|
1 |
$ CREATE DATABASE <dedicated_database>; |
Затем создайте выделенного пользователя базы данных для приложения Django:
|
1 |
$ CREATE USER '<username>'@'%' IDENTIFIED WITH mysql_native_password BY '<user_password>'; |
Наконец, предоставьте выделенному пользователю полные права на выделенную базу данных:
|
1 |
$ GRANT ALL ON <database>.* TO '<username'@'%'; |
- Изменение конфигурации Django для использования MySQL
Теперь нам нужно изменить некоторые настройки Django, чтобы он мог использовать MySQL в качестве сервера базы данных. Откройте settings.py в текстовом редакторе:
|
1 |
$ nano settings.py |
Прокрутите вниз до раздела DATABASES и вставьте следующий код:
|
1 2 3 4 5 6 7 8 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/etc/mysql/my.cnf', }, } } |
Затем отредактируйте конфигурационный файл MySQL, чтобы он содержал необходимые учетные данные базы данных:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
Добавьте следующий блок в конец файла:
|
1 2 3 4 5 |
[client] database = <dedicated_database> user = <dedicated_user> password = <user_password> default-character-set = utf8 |
Перезапустите MySQL, чтобы изменения вступили в силу:
|
1 2 |
$ sudo systemctl daemon-reload $ sudo systemctl restart mysql |
Шаг 6. Создание модели Django
Теперь мы готовы создать новую модель в нашем проекте Django. Активируйте виртуальное окружение:
|
1 2 3 |
$ cd sample_app/ $ . sample_app_env/bin/activate $ cd sample_app/ |
Находясь в этой папке, укажите Django создать новое приложение:
|
1 |
$ python manage.py startapp <new_app> |
После создания дерево файлов должно выглядеть примерно так. Здесь файл models.py будет содержать код для нашей пользовательской модели Django:
Проверьте текущее содержимое файла:
|
1 |
$ cat models.py |
Для демонстрации мы создадим модель для постов в блоге под названием Post. Она будет содержать следующие поля:
title: Заголовок поста в блоге.slug: Хранит и генерирует валидные URL-адреса для веб-страниц.content: Текст поста в блоге.created_on: Дата создания поста.author: Пользователь, создавший пост.
Откройте файл models.py в текстовом редакторе:
|
1 |
$ nano models.py |
Давайте импортируем некоторые необходимые API для нашей модели. По умолчанию импортируется API моделей. Нам также понадобятся API slugify для генерации слагов, User для аутентификации и reverse для более удобного и гибкого создания URL-адресов:
|
1 2 3 4 |
from django.db import models from django.template.defaultfilters import slugify from django.contrib.auth.models import User from django.urls import reverse |
Затем добавьте класс под названием Post. Он будет содержать необходимые поля базы данных, такие как title, slug, content, created_on, и author:
|
1 2 3 4 5 6 |
class Post(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(unique=True, max_length=255) content = models.TextField() created_on = models.DateTimeField(auto_now_add=True) author = models.TextField() |
Нам нужна функциональность для генерации URL и сохранения поста. Это важно, так как это генерирует уникальные ссылки, соответствующие уникальным постам:
|
1 2 3 4 5 6 7 |
def get_absolute_url(self): return reverse('blog_post_detail', args=[self.slug]) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super(Post, self).save(*args, **kwargs) |
Следующий раздел укажет модели, как упорядочивать посты и отображать их на веб-странице. Мы закодируем эту логику с помощью внутреннего класса Meta. Он будет содержать дополнительную логику модели, которая не касается определения полей базы данных:
|
1 2 3 4 5 |
class Meta: ordering = ['created_on'] def __unicode__(self): return self.title |
Наконец, в этом файле у нас будет функция модели Comment. Для этого требуется добавить еще один класс Comment с использованием models.Model в качестве его сигнатуры. Он будет содержать следующие поля базы данных:
- name: Имя комментатора.
- email: Адрес электронной почты комментатора.
- text: Содержимое самого комментария.
- post: Пост, к которому был оставлен комментарий.
- created_on: Время создания комментария.
Код будет выглядеть примерно так:
|
1 2 3 4 5 6 7 |
class Comment(models.Model): name = models.CharField(max_length=42) email = models.EmailField(max_length=75) website = models.URLField(max_length=200, null=True, blank=True) content = models.TextField() post = models.ForeignKey(Post, on_delete=models.CASCADE) created_on = models.DateTimeField(auto_now_add=True) |
На данном этапе наш файл models.py будет выглядеть следующим образом:
Наконец, сохраните файл и закройте редактор.
Шаг 7. Обновление настроек Django
Модель создана. Однако нам нужно настроить некоторые конфигурационные файлы, чтобы запустить модель в работу. Внутри settings.py, нам нужно добавить нашу модель в INSTALLED_APPS.
Откройте settings.py в текстовом редакторе:
|
1 |
$ nano settings.py |
Зарегистрируйте новый модуль в разделе INSTALLED_APPS:
Сохраните файл и закройте редактор.
Шаг 8. Миграция изменений
Теперь, когда мы добавили все желаемые модели, следующим шагом будет применение этих изменений. Django применит эти схемы к нашей базе данных MySQL.
Следующая команда сгенерирует все необходимые файлы миграции. Вывод покажет расположение всех этих файлов в каталоге проекта:
|
1 |
$ python manage.py makemigrations |
Следующая команда выведет список всех существующих миграций:
|
1 |
$ python manage.py showmigrations |
Обратите внимание, что все миграции отмечены, за исключением 0001_initial, которая была создана как часть моделей Post и Comment.
Следующая команда покажет, какой SQL-запрос выполнит Django для создания миграций:
|
1 |
$ python manage.py sqlmigrate random_app 0001_initial |
Теперь нам осталось только применить миграции. Эти миграции запишут изменения в базу данных:
|
1 |
$ python manage.py migrate |
Шаг 9. Проверка изменений
Чтобы проверить изменения, давайте заглянем в нашу базу данных MySQL. Запустите оболочку MySQL от имени пользователя Django:
|
1 |
$ mysql sample_app_data -u sample_app_user |
Затем измените текущую активную базу данных на базу данных приложения Django:
|
1 |
$ USE <django_dedicated_database>; |
Выведите список всех таблиц из базы данных:
|
1 |
$ SHOW TABLES; |
Наконец, чтобы увидеть содержимое любой из таблиц, используйте DESCRIBE запрос:
|
1 2 |
$ DESCRIBE random_app_comment; $ DESCRIBE random_app_post; |
Ограничения Django при работе с MySQL
При использовании MySQL в качестве сервера базы данных для вашего приложения Django следует иметь в виду несколько вещей:
- Поддержка транзакций для процессов, изменяющих схему, практически отсутствует. Это означает, что в случае сбоя миграции потребуется вручную отменить все изменения, прежде чем пытаться выполнить другую миграцию. Невозможно откатиться к более ранней точке, когда неудачная миграция еще не была выполнена.
- Для большинства процессов, изменяющих схему, MySQL полностью перезаписывает таблицы. В определенных ситуациях это может занять очень много времени. В худшем случае временная сложность будет пропорциональна количеству добавляемых строк или удаляемых столбцов. Согласно официальной документации Django, это может занять одну минуту на миллион строк.
- MySQL накладывает ограничение на количество символов в именах столбцов, таблиц и индексов. Также существует ограничение на общий размер всех столбцов и покрытий индексов. Django может превысить этот лимит. Некоторые другие СУБД, помимо MySQL, могут справляться с более высокими лимитами Django.
Вот почему настоятельно рекомендуется взвесить все варианты и выбрать наиболее подходящий.
Заключение
В этом руководстве успешно продемонстрировано, как добавлять модули в существующее приложение Django. В качестве бэкенда для приложения мы использовали MySQL. Здесь также показаны некоторые ключевые концепции Django, такие как модели, принцип работы миграций и то, как Django преобразует модели в таблицы базы данных MySQL.
Приятной работы!





















Комментарии
Комментариев пока нет. Будьте первым.