🔖 Справочник: команды моделей и миграций Django

⚡ Ключевые команды

  • python manage.py makemigrations — создать файл миграции
  • python manage.py migrate — применить к БД
  • python manage.py sqlmigrate app 0001 — показать SQL
  • python manage.py showmigrations — список миграций
  • python manage.py shell — Django shell
  • python manage.py dbshell — SQL shell

Команды миграций

makemigrations — создать файл миграции

# Создать миграции для всех приложений
python manage.py makemigrations

# Создать миграции только для конкретного приложения
python manage.py makemigrations library

# Создать миграцию с явным именем
python manage.py makemigrations library --name add_publisher_model

# Проверить изменения без создания файла (dry run)
python manage.py makemigrations --check

migrate — применить миграции

# Применить все ожидающие миграции
python manage.py migrate

# Применить миграции только для приложения library
python manage.py migrate library

# Откатить до конкретной миграции
python manage.py migrate library 0002

# Откатить все миграции приложения
python manage.py migrate library zero

sqlmigrate — посмотреть SQL

# Показать SQL, который будет выполнен при применении миграции
python manage.py sqlmigrate library 0001

# Показать SQL для отката
python manage.py sqlmigrate library 0001 --backwards

showmigrations — список миграций

# Показать все миграции всех приложений
python manage.py showmigrations

# Только для одного приложения
python manage.py showmigrations library

# Вывод: [X] = применена, [ ] = ещё нет

Команды Django shell

shell — интерактивная оболочка

# Запустить Django shell (Python REPL с Django context)
python manage.py shell

# Внутри shell:
from library.models import Author, Book

# Создать объект
author = Author(first_name="Leo", last_name="Tolstoy", birth_date="1828-09-09")
author.save()

# Или одной командой
author = Author.objects.create(first_name="Leo", last_name="Tolstoy", birth_date="1828-09-09")

# Получить все объекты
Author.objects.all()

# Фильтрация
Author.objects.filter(last_name="Tolstoy")

# Получить один объект
Author.objects.get(id=1)

# Удалить
author.delete()

dbshell — SQL-оболочка

# Подключиться к БД напрямую (SQLite, MySQL, PostgreSQL...)
python manage.py dbshell

# Внутри SQLite shell:
.tables                     # список таблиц
.schema library_author      # структура таблицы
SELECT * FROM library_author LIMIT 5;
.quit

Типы полей — быстрый справочник

Строковые и текстовые

models.CharField(max_length=100)           # строка до 100 символов
models.TextField()                          # текст без ограничения длины
models.EmailField()                         # email (валидация формата)
models.URLField()                           # URL (валидация формата)
models.SlugField(max_length=50)             # slug (только a-z, 0-9, -, _)

Числовые

models.IntegerField()                       # целое
models.FloatField()                         # дробное
models.DecimalField(max_digits=6, decimal_places=2)  # точная десятичная дробь
models.PositiveIntegerField()               # положительное целое

Логические

models.BooleanField(default=False)          # True/False
models.NullBooleanField()                   # True/False/None (устаревшее, см. old-vs-new)

Даты и время

models.DateField()                          # только дата
models.DateField(auto_now_add=True)         # дата создания (только один раз)
models.DateField(auto_now=True)             # дата обновления (каждый save)
models.DateTimeField()                      # дата + время
models.TimeField()                          # только время

Специальные параметры дат

models.DateField(auto_now_add=True)   # заполняется автоматически при создании
models.DateField(auto_now=True)       # обновляется при каждом .save()
# Замечание: auto_now и auto_now_add делают поле нередактируемым в Admin

Типы связей

ForeignKey (один ко многим)

models.ForeignKey(
    'ModelName',                # или прямое имя класса
    on_delete=models.CASCADE,   # ОБЯЗАТЕЛЬНО
    null=True,                  # разрешить NULL (опционально)
    blank=True,                 # разрешить пустое в форме
    related_name='books',       # обратное имя: author.books.all()
    verbose_name="Автор"
)

ManyToManyField (многие ко многим)

models.ManyToManyField(
    'ModelName',
    related_name='libraries',   # обратное имя
    blank=True                  # можно не указывать ни одного
    # НЕТ on_delete — это промежуточная таблица
)

OneToOneField (один к одному)

models.OneToOneField(
    'ModelName',
    on_delete=models.CASCADE,   # ОБЯЗАТЕЛЬНО
    related_name='details',     # author.details — доступ к деталям
    null=True                   # опционально
)

Класс Meta

class Author(models.Model):
    ...
    class Meta:
        verbose_name = "Автор"             # единственное число в Admin
        verbose_name_plural = "Авторы"     # множественное число
        ordering = ['-birth_date']         # сортировка по умолчанию
        unique_together = [['first_name', 'last_name']]  # составная уникальность
        db_table = 'custom_author_table'   # имя таблицы в БД