Django ORM позволяет работать с базой данных через Python-объекты, а не вручную писать SQL-запросы. Это ускоряет разработку, делает код чище и обеспечивает быструю и безопасную работу с данными.
ORM (Object-Relational Mapping) — это технология отображения объектов языка программирования на таблицы реляционных баз данных.
С ORM разработчик работает не напрямую с SQL-запросами, а с Python‑объектами, которые «превращаются» в SQL под капотом.
В Django встроен собственный ORM, который позволяет:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
birth_date = models.DateField(null=True, blank=True)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_at = models.DateField()
is_available = models.BooleanField(default=True)
def __str__(self):
return self.title
Здесь мы определили 2 модели — Author
и Book
. Django автоматически создаст для них таблицы в базе данных.
author = Author.objects.create(name="Достоевский")
Book.objects.create(title="Преступление и наказание", author=author, published_at="1866-01-01")
books = Book.objects.all() # все книги
book = Book.objects.get(id=1) # книга по id
filtered = Book.objects.filter(is_available=True) # только доступные
book = Book.objects.get(id=1)
book.title = "Преступление и наказание (ред.)"
book.save()
book = Book.objects.get(id=1)
book.delete()
Django ORM поддерживает агрегаты, аннотации и связи.
from django.db.models import Count
# Количество книг у каждого автора
authors = Author.objects.annotate(book_count=Count("book"))
for a in authors:
print(a.name, a.book_count)
Хотя ORM покрывает 90% задач, иногда без SQL не обойтись:
В Django можно писать «сырой SQL»:
books = Book.objects.raw("SELECT * FROM myapp_book WHERE title LIKE %s", ["%Достоевский%"])
Django ORM — это мощный инструмент, который:
Если вы работаете с Django — использовать ORM почти всегда выгоднее, чем писать SQL вручную.
А когда стандартных возможностей не хватает — всегда можно расширить их с помощью «сырого» SQL или сторонних библиотек.