Основы и использование Django ORM в Python

API Django ORM используется в Python для взаимодействия с реляционными базами данных.

Содержание

Введение в Django ORM

ORM (object-relational mapping) означает объектно-реляционное отображение. ORM — это метод, позволяющий манипулировать данными в реляционной базе данных с помощью объектно-ориентированного программирования.

Django ORM позволяет использовать тот же API Python для взаимодействия с различными реляционными базами данных, включая PostgreSQL, MySQL, Oracle и SQLite. Полный список поддерживаемых баз данных можно посмотреть здесь.

Django ORM использует шаблон active record:

  • Класс сопоставляется с одной таблицей в базе данных. Класс часто называют классом модели.
  • Объект класса сопоставляется с одной строкой в таблице.

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

Также Django автоматически генерирует административный сайт для управления данными моделей. Давайте рассмотрим простой пример, чтобы увидеть, как работает Django ORM.

Создание базового проекта

Мы создадим базовый проект с новой виртуальной средой.

Создание новой виртуальной среды

Сначала создайте новую виртуальную среду, используя встроенный модуль venv:

python -m venv venv

Во-вторых, активируйте виртуальную среду:

venv\scripts\activate

В-третьих, установите пакет django и django-extensions:

pip install django django-extensions

Пакет django-extensions предоставляет вам некоторые пользовательские расширения для фреймворка Django. Мы будем использовать пакет django-extensions для вывода сгенерированного SQL с помощью Django ORM.

Создание нового проекта

Сначала создайте новый проект Django с именем django_orm:

django-admin startproject django_orm

Во-вторых, создайте HR-приложение внутри проекта django_orm:

cd django_orm
python manage.py startapp hr

В-третьих, зарегистрируйте hr и django_extensions в INSTALLED_APPS файла settings.py проекта:

INSTALLED_APPS = [
    # ...
    'django_extensions',
    'hr',
]

Настройка сервера базы данных PostgreSQL

Сначала установите сервер базы данных PostgreSQL на локальном компьютере.

Во-вторых, войдите в сервер базы данных PostgreSQL. Он запросит у вас пароль пользователя postgres. Обратите внимание, что вы используете тот же пароль, который вы ввели для пользователя postgres во время установки.

psql -U postgres
Password for user postgres:

В-третьих, создайте новую базу данных с именем hr и введите exit, чтобы выйти из программы psql:

postgres=# create database hr;
CREATE DATABASE
postgres=# exit

Подключение к PostgreSQL из Django

Сначала настройте подключение к базе данных в settings.py проекта django_orm:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'hr',
        'USER': 'postgres',
        'PASSWORD': 'POSTGRES_PASSWORD',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Обратите внимание, что вы меняете POSTGRES_PASSWORD на свой пароль.

Во-вторых, установите пакет psycopg2, чтобы Django мог подключиться к серверу базы данных PostgreSQL:

pip install psycopg2

В-третьих, запустите сервер разработки Django:

python manage.py runserver

Вы увидите домашнюю страницу Django по умолчанию:

Домашняя страница Django ORM

Определение модели

Сначала определите класс Employee в приложении hr, который имеет два поля first_name и last_name:

from django.db import models


class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

Во-вторых, выполните миграции с помощью команды makemigrations:

python manage.py makemigrations

Выход:

Migrations for 'hr':
  hr\migrations\0001_initial.py
    - Create model Employee

В-третьих, распространите изменения в базе данных с помощью команды миграции:

python manage.py migrate

Django создает множество таблиц, включая таблицы для встроенных моделей, таких как User и Group. В этом уроке мы сосредоточимся на классе Employee.

На основе класса модели Employee Django ORM создает в базе данных таблицу hr_employee:

Пример Django ORM

Django объединяет имя приложения и имя класса для генерации имени таблицы:

app_modelclass

В этом примере имя приложения — hr, а имя класса — Employee. Поэтому Django создает таблицу с именем hr_employee. Обратите внимание, что Django преобразует имя класса в нижний регистр перед добавлением его к имени приложения.

Класс модели Employee имеет два поля first_name и last_name. Поскольку класс Employee наследуется от класса models.Model, Django автоматически добавляет поле id как поле с автоинкрементом, называемое id. Таким образом, таблица hr_employee имеет три столбца id, first_name и last_name.

Для взаимодействия с таблицей hr_employee можно запустить команду shell_plus из пакета django-extensions.

Обратите внимание, что Django предоставляет вам встроенную команду shell. Однако с командой shell_plus работать удобнее. Например, она автоматически загружает модели, определенные в проекте, и отображает сгенерированный SQL.

Запустите команду shell_plus с параметром —print-sql:

python manage.py shell_plus --print-sql

Вставка данных

Сначала создайте новый объект Employee и вызовите метод save(), чтобы вставить новую строку в таблицу:

>>> e = Employee(first_name='John',last_name='Doe')
>>> e.save()
INSERT INTO "hr_employee"("first_name", "last_name")
VALUES('John', 'Doe') RETURNING "hr_employee"."id"
Execution time: 0.003234s [Database: default]

В этом примере вам не нужно устанавливать значение для столбца id. База данных автоматически генерирует его значение, и Django установит его, как только вы вставите новую строку в таблицу.

Как показано в выводе, Django использует оператор INSERT для вставки новой строки с двумя столбцами first_name и last_name в таблицу hr_employee.

Во-вторых, вставьте второго сотрудника с именем Jane и фамилией Doe:

>>> e = Employee(first_name='Jane',last_name='Doe')
>>> e.save()
INSERT INTO "hr_employee"("first_name", "last_name")
VALUES('Jane', 'Doe') RETURNING "hr_employee"."id"
Execution time: 0.002195s [Database: default]

Теперь таблица hr_employee содержит две строки с идентификаторами 1 и 2.

Выбор данных

Чтобы выбрать все строки из таблицы hr_employees, используйте метод all() следующим образом:

>>> Employee.objects.all()
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 LIMIT 21
Execution time: 0.001856s [Database: default]
<QuerySet [<Employee: John Doe>, <Employee: Jane Doe>]>

Как это работает.

  • Сначала Django использует оператор SELECT для выбора строк из таблицы hr_employee.
  • Во-вторых, Django преобразует строки в объекты Employee и возвращает QuerySet, содержащий объекты Employee.

Обратите внимание, что Django добавляет LIMIT для возврата 21 записи для отображения в оболочке.

Чтобы выбрать одну строку по идентификатору, можно использовать метод get(). Например, следующий код возвращает сотрудника с идентификатором 1:

>>> e = Employee.objects.get(id=1)
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 WHERE "hr_employee"."id" = 1
 LIMIT 21
Execution time: 0.001003s [Database: default]
>>> e
<Employee: John Doe>

В отличие от метода all(), метод get() возвращает объект Employee вместо QuerySet.

Чтобы найти сотрудников по имени, можно использовать метод filter() объекта QuerySet. Например, следующий код находит сотрудников с именем Jane:

>>> Employee.objects.filter(first_name='Jane')
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 WHERE "hr_employee"."first_name" = 'Jane'
 LIMIT 21
Execution time: 0.000000s [Database: default]
<QuerySet [<Employee: Jane Doe>]>

Обновление данных

Сначала выберите сотрудника с идентификатором 2:

>>> e = Employee.objects.get(id=2)
SELECT "hr_employee"."id",
       "hr_employee"."first_name",
       "hr_employee"."last_name"
  FROM "hr_employee"
 WHERE "hr_employee"."id" = 2
 LIMIT 21
Execution time: 0.001022s [Database: default]

Во-вторых, обновите фамилию выбранного сотрудника на Smith:

>>> e.last_name = 'Smith'
>>> e.save()
UPDATE "hr_employee"
   SET "first_name" = 'Jane',
       "last_name" = 'Smith'
 WHERE "hr_employee"."id" = 2
Execution time: 0.004019s [Database: default]
>>> e
<Employee: Jane Smith>

Удаление

Чтобы удалить экземпляр модели, используйте метод delete(). Следующий пример удаляет сотрудника с идентификатором 2:

>>> e.delete()
DELETE
  FROM "hr_employee"
 WHERE "hr_employee"."id" IN(2)
Execution time: 0.002001s [Database: default]
(1, {'hr.Employee': 1})

Чтобы удалить все экземпляры модели, используйте метод all() для выбора всех сотрудников и вызовите метод delete() для удаления всех выбранных сотрудников:

>>> Employee.objects.all().delete()
DELETE
  FROM "hr_employee"
Execution time: 0.001076s [Database: default]
(1, {'hr.Employee': 1})

Django использует оператор DELETE без предложения WHERE для удаления всех строк из таблицы hr_employee.

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

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