Модели данных и поля

В реляционных базах данные хранятся в таблицах, почти как Excel или Google Spreadsheets. Представим, что у вас есть собственный блог, где вы пишете статьи. Данные о постах в БД выглядят примерно так:

скриншот

В таблице 5 колонок: номер статьи, заголовок, текст, время создания и время публикации. Каждая строчка — это пост.

Статьи блога хранятся в базе данных, но как их оттуда достать? Для этого и нужен Django ORM. Он извлекает данные из базы в удобном виде: например, даты из колонок время создания и время публикации, он сразу сделает объектами datetime, а не строками. Но чтобы Django ORM работала, ей нужно описание таблицы.

Давайте вместе попробуем составить модель для поста в блоге. Для начала в ней будет только одна колонка — текст:

from django.db import models

class Post(models.Model):
    text = models.TextField()

Давайте просто игнорировать все эти class и models.Model и перейдём к сути. Post — это название модели данных — поста в блоге. В базе данных много таблиц и нужно дать ей название.

Таблицу назвали, теперь создадим колонки. Текст статьи сохраним в колонке text. Это и делает последняя строчка: text = models.TextField(). Здесь написано, что у поста будет колонка text, и хранить его нужно в поле для текстаmodels.TextField(). Поля сообщают какого типа данные будут хранится у модели.

Расширяем модель

Теперь у поста будет и заголовок:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()

Заголовок — это тоже текст, но у него не TextField, а CharField. Это тоже поле для хранения текста, но оно ограничено по длине — не более 200 символов. Эти поля очень похожи, но называются по-разному. Это сделано потому, что для базы данных это достаточно существенно: в одном случае она знает, что на заголовок ей нужно выделить 200 символов памяти, а во втором не понятно сколько памяти займёт эта колонка.

Добавим дату и время написания поста created_date и его публикации published_date:

from django.db import models

class Post(models.Model):
    text = models.TextField()
    title = models.CharField(max_length=200)
    created_date = models.DateTimeField()
    published_date = models.DateTimeField()

DateTimeField хранит дату и время. Теперь получилась модель, которая описывает табличку с картинки в начале статьи.

Что читать

Можно узнать как работать с данными в нашей статье Достаем данные из БД.

Или узнать больше о написании моделей: - Перевод документации - Документация Django - Больше о моделях в или нашей статье связи между моделями