Модели Django в Python на примерах

В Django модель является подклассом класса django.db.models.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']

После определения моделей вы можете создавать и применять миграции для создания таблиц в базе данных, что мы рассмотрим в следующем уроке.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *