📖 Теория: конспект Django-блока (Уроки 13–17)

🎯 Итоговое повторение К оглавлению урока

⚡ Краткий конспект

  • Фреймворк — набор инструментов и структур для ускорения разработки. Django включает ORM, admin, auth «из коробки».
  • Проект Django — создаётся через django-admin startproject config .. Точка входа: manage.py.
  • settings.py — INSTALLED_APPS, DATABASES, SECRET_KEY, DEBUG, ALLOWED_HOSTS, MIDDLEWARE.
  • Приложенияpython manage.py startapp myapp. Регистрация в INSTALLED_APPS.
  • Модели — классы, наследуемые от models.Model. Поля: CharField, TextField, IntegerField, DateField, BooleanField и др.
  • Миграцииmakemigrationsmigrate. Хранятся в migrations/, трекаются в django_migrations.
  • Adminadmin.site.register(Model). Суперпользователь: createsuperuser. Доступ: /admin/.
  • Связи — ForeignKey (многие-к-одному), ManyToManyField (многие-ко-многим), OneToOneField (один-к-одному).

1. Фреймворк и библиотека

ПонятиеОписаниеПреимущества
Фреймворк Набор инструментов, шаблонов и структур для упрощения и ускорения разработки приложений Ускорение разработки, соблюдение стандартов, безопасность, масштабируемость
Библиотека Набор функций и классов для выполнения конкретных задач. Не накладывает жёстких ограничений на архитектуру Переиспользование кода, разделение ответственности, улучшение обслуживаемости

Популярные Python-фреймворки

ФреймворкОсобенности
DjangoORM, административный интерфейс, множество встроенных инструментов
FlaskБольшая свобода в выборе компонентов и архитектуры
FastAPIАвтогенерация документации, высокая производительность

Почему Django?

  • Широко применяется в индустрии, доказанная репутация
  • Расширения и пакеты для дополнительной функциональности
  • Поддержка PostgreSQL, MySQL, SQLite, Oracle и других СУБД
  • Большое и активное сообщество разработчиков

2. Создание проекта и структура файлов

Создание проекта

# Установка Django
pip install django

# Создание проекта (точка — создаёт структуру в текущей папке)
django-admin startproject config .

# Запуск сервера разработки
python manage.py runserver  # http://127.0.0.1:8000/

Роль manage.py

КомандаДействие
python manage.py runserverЗапустить сервер разработки
python manage.py startapp myappСоздать новое приложение
python manage.py makemigrationsСоздать файлы миграций
python manage.py migrateПрименить миграции к БД
python manage.py createsuperuserСоздать суперпользователя
python manage.py shellЗапустить Django-оболочку

Ключевые файлы settings.py

НастройкаОписание
SECRET_KEYУникальный ключ для криптографических операций. Никогда не хранить в коде — только в .env
DEBUGTrue — режим разработки (детальные ошибки). False — продакшн
ALLOWED_HOSTSСписок разрешённых доменов/IP. Защита от HTTP Host Header атак
INSTALLED_APPSСписок зарегистрированных приложений (встроенных и своих)
DATABASESКонфигурация подключения к БД. По умолчанию SQLite
MIDDLEWAREЦепочка промежуточного ПО (безопасность, сессии, CSRF, auth…)
ROOT_URLCONFПуть к главному файлу маршрутизации (config.urls)
DEFAULT_AUTO_FIELDТип поля для автоматического PK. Рекомендуется BigAutoField

3. Приложения Django

Django-приложение — самодостаточный модуль, выполняющий определённую функциональность. Может переиспользоваться в других проектах.

# Создание приложения
python manage.py startapp myapp

Структура приложения

myapp/
|-- migrations/
|   |-- __init__.py       # Директория для файлов миграций
|-- __init__.py           # Python-пакет
|-- admin.py              # Регистрация моделей в admin-панели
|-- apps.py               # Конфигурация приложения
|-- models.py             # Определения моделей (таблиц БД)
|-- tests.py              # Тесты приложения
|-- views.py              # Представления (обрабатывают запросы)

Регистрация приложения

# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Своё приложение — лучше через конфигурационный класс
    'myapp.apps.MyappConfig',
]

4. Модели Django

Модель — класс, наследующийся от models.Model. Описывает структуру таблицы в БД: поля, типы, ограничения.

# myapp/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    # id добавляется автоматически как BigAutoField (первичный ключ)

Типы полей по категориям

КатегорияПоля
СтроковыеCharField, TextField, EmailField, SlugField, URLField
ЧисловыеIntegerField, BigIntegerField, PositiveIntegerField, FloatField, DecimalField, SmallIntegerField
ЛогическиеBooleanField
Дата/времяDateField, TimeField, DateTimeField, DurationField
ФайлыFileField, ImageField, FilePathField
ПрочиеUUIDField, GenericIPAddressField, BinaryField
СвязиForeignKey, ManyToManyField, OneToOneField

Общие параметры полей

ПараметрОписаниеПо умолчанию
nullРазрешает NULL в БДFalse
blankРазрешает пустое значение в формахFalse
defaultЗначение по умолчанию
uniqueУникальность значенияFalse
max_lengthМаксимальная длина строки
verbose_nameЧитаемое имя в admin и формах
help_textПодсказка в admin и формах
db_indexСоздаёт индекс в БДFalse
primary_keyДелает поле первичным ключомFalse
choicesОграничивает набором вариантов
validatorsСписок валидаторов

5. Механизм миграций

Миграции — механизм версионирования изменений схемы БД. Позволяют изменять модели и применять изменения без потери данных.

# 1. Создать файлы миграций (анализирует models.py)
python manage.py makemigrations

# 2. Применить миграции к БД
python manage.py migrate

# Просмотр состояния миграций
python manage.py showmigrations

Механизм работы

  1. Обнаружение изменений — Django сравнивает текущие модели с предыдущими миграциями
  2. Создание файла — генерирует Python-скрипт в migrations/ (0001_initial.py, 0002_xxx.py…)
  3. Применениеmigrate проверяет таблицу django_migrations, применяет непримененные
  4. Обновление реестра — добавляет запись в django_migrations
  5. Откат — при ошибке откатывается через транзакции

Нюансы изменения моделей

ОперацияПроблемаРешение
Добавить полеНеизвестное значение для существующих записейУказать null=True или default=...
Изменить тип поляНесовместимость с существующими даннымиОбновить данные заранее, применять постепенно
Удалить полеПотеря данныхРезервная копия, убедиться что данные не нужны

6. Административная панель

Django Admin — встроенный веб-интерфейс для управления данными моделей. Доступен по адресу /admin/.

# myapp/admin.py
from django.contrib import admin
from .models import Book

# Простая регистрация
admin.site.register(Book)

# Расширенная регистрация через ModelAdmin
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'author', 'published_date']
    search_fields = ['title', 'author']
    list_filter = ['published_date']
    ordering = ['-published_date']

Суперпользователь

# Создание суперпользователя
python manage.py createsuperuser
# → вводим username, email, password

# Запуск сервера и вход в admin
python manage.py runserver
# Открыть: http://127.0.0.1:8000/admin/

7. Связи между моделями

Тип связиПолеОписание
Многие-к-одномуForeignKeyМного книг у одного автора. Создаёт столбец author_id
Многие-ко-многимManyToManyFieldКнига у многих авторов и автор у многих книг. Создаёт промежуточную таблицу
Один-к-одномуOneToOneFieldУ пользователя один профиль. Уникальная ссылка
# Пример ForeignKey
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(
        Author,
        on_delete=models.CASCADE,  # Удалить книги при удалении автора
        related_name='books'
    )

# Пример ManyToManyField
class Tag(models.Model):
    name = models.CharField(max_length=50)

class Article(models.Model):
    title = models.CharField(max_length=200)
    tags = models.ManyToManyField(Tag, blank=True)

# Пример OneToOneField
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)