Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Модель Python: Django ORM

Модель — это воплощение понятия предметной области в коде приложения. В Django ORM каждая модель представлена классом в коде и таблицей в базе данных:

from django.db import models

class User(models.Model):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=100, null=True)
    last_name = models.CharField(max_length=100)
    nickname = models.CharField(max_length=20, null=True)
    # ^ таким образом описанные атрибуты класса называют "полями"
  1. Модель представляется классом только в языках с классами. Технически она может быть чем угодно в зависимости от языка.
  2. Поля модели описывают одноимённые столбцы таблицы и одновременно являются свойствами (properties) класса, что позволяет им следить, например, за присваиваемыми полям значениями. В других ORM и других языках столбцы могут быть описаны иначе.
  3. Связь "Модель-Таблица" — это особенность паттерна Active Record. В другом подходе, называемом Data Mapper, всё может быть по-другому.

Единственное, что нужно для работы модели — создать таблицу в базе данных. Для чего, в свою очередь, потребуется миграция. Django генерирует миграции по команде makemigrations и применяет по команде migrate:

poetry run python manage.py makemigrations
poetry run python manage.py migrate

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

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

>>> user = User()
# Присваивание значений атрибутам учитывает тип и настройки полей
>>> user.email = 'user@email.com'
>>> user.first_name = 'Pedro'
>>> user.last_name = 'Rodriges'
>>> # Пароли нельзя сохранять простым присваиванием
>>> user.set_password('rasmuslerdorf')
>>> user.save()  # INSERT (добавление новой записи)
>>> user.email = 'pedro@hotmail.com'
>>> user.save()  # UPDATE (обновление существующей записи)
>>> user.email
'pedro@hotmail.com'
>>> user.delete()  # удаление пользователя

Из примера выше видно, что при создании или обновлении сущности, используется метод save(), а Django ORM сама распознает что происходит: создание или обновление.

Сущности можно также создавать и с помощью метода .create() у специальной сущности — менеджера. Дело в том, что за каждой моделью закреплён хотя бы один менеджер, получить доступ к которому можно через атрибут .objects. Менеджер отвечает за операции, относящиеся не одной конкретной сущности, а к самой таблице. Метод .create() воздействует на таблицу, создавая в ней новую запись:

>>> User.objects.create(email='foo@bar.baz', first_name='Moe')
INSERT INTO ...
...
Execution time: 0.009294s [Database: default]
<User: User object (3)>
>>>

После того как сущность сохранена в базу, её можно извлечь. Самый простой способ сделать это - воспользоваться методом .get() менеджера. Он выполняет поиск по первичному ключу.

>>> moe = User.objects.get(id=3)
SELECT ...
...
>>> moe
<User: User object (3)>
>>> # Если записи не существует, то будет возбуждено исключение
>>> User.objects.get(id=100500)
SELECT ...
...
Traceback (most recent call last):
  File "<console>", line 1, in <module>
...
python_django_orm_blog.blog.models.User.DoesNotExist: User matching query does not exist.

Самостоятельная работа

  1. Зайдите в REPL набрав make shell.
  2. Создайте нескольких пользователей, обновите их.
  3. Переоткройте REPL и извлеките сущности из базы данных.
  4. Удалить часть сущностей.

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

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

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
2 февраля 8 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»