Команды миграций
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' # имя таблицы в БД