Модели Django в Python на примерах
В Django модель является подклассом класса django.db.models.Model. Модель содержит одно или несколько полей и методов, которые манипулируют полями.
- Что такое модели Django?
- Использование моделей
- Встроенные модели
- Внешние ключи
- Метод __str__()
- Добавление класса Meta к классу Model
Что такое модели Django?
По сути, модель Django сопоставляется с одной таблицей в базе данных, в которой каждое поле модели представляет столбец в таблице.
Приложение может иметь ноль или более моделей, хранящихся в модуле models.py. Например, следующее определяет модель Post для приложения блога:
from django.db import models from django.utils import timezone class Post(models.Model): title = models.CharField(max_length=120) content = models.TextField() published_at = models.DateTimeField(default=timezone.now)
Модель Post имеет поля title, content и published_at. На основе модели Post Django создаст таблицу в базе данных со следующим кодом SQL:
CREATE TABLE "blog_post"( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(120) NOT NULL, "content" text NOT NULL, "published_at" datetime NOT NULL, );
Обратите внимание, что сгенерированный выше SQL предназначен для SQLite. Если вы используете другую базу данных, вы увидите, что код SQL немного отличается.
Имя таблицы blog_post автоматически выводится из имен приложения и модели:
application.model
В этом примере Django создаст таблицу blog_post для модели Post.
Чтобы указать имя таблицы вместо использования имени по умолчанию, сгенерированного Django, можно использовать атрибут db_table класса Meta следующим образом:
from django.db import models from django.utils import timezone class Post(models.Model): title = models.CharField(max_length=120) content = models.TextField() published_at = models.DateTimeField(default=timezone.now) class Meta: db_table = 'posts'
В этом случае модель Post будет отображаться в таблице постов вместо сгенерированной таблицы blog_post. В этом руководстве мы будем придерживаться сгенерированного имени таблицы по умолчанию blog_post.
При создании таблицы Django автоматически добавляет поле id в качестве первичного ключа таблицы. Поле id — это автоинкрементное поле с типом, указанным в файле settings.py проекта:
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Если вы хотите указать собственное поле первичного ключа, вам необходимо явно определить его в модели следующим образом:
post_id = models.BigAutoField(primary_key=True)
В этом примере primary_key=True указывает, что post_id является первичным ключом. Когда Django видит поле в модели с primary_key=True, он не добавит автоматический столбец id.
Django требует, чтобы каждая модель имела ровно одно поле с primary_key=True.
Использование моделей
После определения моделей вам необходимо сообщить Django, что вы собираетесь их использовать, зарегистрировав имя приложения в списке INSTALLED_APPS в settings.py проекта:
INSTALLED_APPS = [ # ... 'blog.apps.BlogConfig', ]
Встроенные модели
Django поставляется с некоторыми встроенными моделями, такими как User из модуля django.contrib.auth.models. Чтобы использовать модель User, вам нужно импортировать ее в файл models.py:
from django.contrib.auth.models import User
Внешние ключи
Каждый пост в приложении блога создается пользователем, и пользователь может создать ноль или более постов. Это называется отношением one-to-many relationship (один-ко-многим).
Для моделирования данного отношения используется поле ForeignKey:
from django.db import models from django.utils import timezone from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=120) content = models.TextField() published_at = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASCADE)
На основе этой модели Django создаст таблицу blog_post со следующей структурой:
CREATE TABLE "blog_post"( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(120) NOT NULL, "content" text NOT NULL, "published_at" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user"("id") DEFERRABLE INITIALLY DEFERRED );
В этом примере auth_id — это внешний ключ, который создает связь между таблицей blog_post и таблицей auth_user. Обратите внимание, что таблица auth_user — это таблица, предоставленная Django.
Метод __str__()
Чтобы определить строковое представление модели, можно переопределить метод __str__(). Например:
from django.db import models from django.utils import timezone from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=120) content = models.TextField() published_at = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.title
Когда вы используете экземпляр модели Post в качестве строки, Django вызывает метод __str__() и отображает его результат.
Добавление класса Meta к классу Model
Класс Meta позволяет вам настроить модель. Например, следующее определяет класс Meta внутри класса модели Post, который сортирует посты по published_at в порядке убывания (-published_at), т. е. сначала более новые посты, а затем более старые.
from django.db import models from django.utils import timezone from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=120) content = models.TextField() published_at = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.title class Meta: ordering = ['-published_at']
После определения моделей вы можете создавать и применять миграции для создания таблиц в базе данных, что мы рассмотрим в следующем уроке.