Короткий ответ
Модель Django — это Python-класс, наследующий от django.db.models.Model, где атрибуты класса описывают поля таблицы через классы Field (CharField, IntegerField, ForeignKey и т.д.); если не указано иное, Django автоматически добавляет первичный ключ id (AutoField/BigAutoField).
Как это работает подробнее
Django использует метаклассы, чтобы на основе объявленных полей сформировать схему таблицы (имя по умолчанию: app_modelname в нижнем регистре) и сгенерировать файл миграции через manage.py makemigrations, который затем применяется через migrate.
Пример кода
example.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=200)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books")
published_at = models.DateField(null=True, blank=True)
# python manage.py makemigrations && python manage.py migrateЧто использовать на практике
- Практика. Каждое поле Field транслируется в конкретный тип колонки СУБД (например, CharField(max_length=100) -> varchar(100)); ForeignKey автоматически создаёт колонку с суффиксом _id и соответствующий индекс.
Подводные камни
- Ошибка. Забывают указать on_delete для ForeignKey (обязательный параметр) и выбирают его не задумываясь; не вызывают makemigrations после изменения модели, из-за чего БД расходится с кодом моделей.