Основы и использование Django ORM в Python
API Django ORM используется в Python для взаимодействия с реляционными базами данных.
- Введение в Django ORM
- Создание базового проекта
- Создание новой виртуальной среды
- Создание нового проекта
- Настройка сервера базы данных PostgreSQL
- Подключение к PostgreSQL из Django
- Определение модели
- Вставка данных
- Выбор данных
- Обновление данных
- Удаление
Введение в 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 по умолчанию:
Определение модели
Сначала определите класс 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 объединяет имя приложения и имя класса для генерации имени таблицы:
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.