Django, веб-застосунки забезпечує потужну систему зв'язку об'єктів з базою даних (Object-Relational Mapping — ORM).
Що таке Django ORM?
Django ORM (Object-Relational Mapping) — це інструмент, що дозволяє представляти таблиці бази даних як об'єкти Python. Таким чином, замість того щоб працювати з SQL запитами, можна виконувати операції з базою даних за допомогою простого коду на Python. Це пришвидшує процес розробки і робить його простішим.
Типи зв'язків у Django ORM
- Один до одного
- Багато до одного
- Багато до багатьох
1. Один до одного
Один до одного (One-to-One Relationship) — це тип зв'язку, де запис у одній таблиці може бути пов'язаний тільки з одним записом в іншій таблиці. Для моделювання такого зв'язку в Django використовується поле OneToOneField
.
Сценарій:
Припустимо, в додатку кожен автомобіль має лише одне свідоцтво про реєстрацію, і кожне свідоцтво належить тільки одному автомобілю. У такому випадку можна створити зв'язок один до одного, використовуючи OneToOneField
.
from django.db import models
# Модель Автомобіля
class Car(models.Model):
brand = models.CharField(max_length=50)
model = models.CharField(max_length=50)
year = models.PositiveIntegerField()
def __str__(self):
return f"{self.brand} {self.model} ({self.year})"
# Модель Свідоцтва
class License(models.Model):
car = models.OneToOneField(Car, on_delete=models.CASCADE)
license_number = models.CharField(max_length=20, unique=True)
owner_name = models.CharField(max_length=100)
issue_date = models.DateField()
def __str__(self):
return f"License {self.license_number} for {self.car}"
2. Багато до одного
Багато до одного (Many-to-One Relationship) — це тип зв'язку, де багато записів з однієї таблиці можуть бути пов'язані з одним записом в іншій таблиці. Для моделювання такого зв'язку в Django використовується поле ForeignKey
.
Сценарій:
Один автор може написати багато книг, але кожна книга належить лише одному автору. Такий зв'язок можна змоделювати за допомогою відносини багато до одного.
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)
publication_date = models.DateField()
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books') # Зв'язок багато до одного
def __str__(self):
return self.title
Додавання нового автора та книги
# Створення нового автора
author = Author.objects.create(name="J.K. Rowling", birth_date="1965-07-31")
# Додавання книг до автора
book1 = Book.objects.create(title="Harry Potter and the Philosopher's Stone", publication_date="1997-06-26", author=author)
book2 = Book.objects.create(title="Harry Potter and the Chamber of Secrets", publication_date="1998-07-02", author=author)
Отримання книг автора
# Отримання всіх книг автора
author_instance = Author.objects.get(name="J.K. Rowling")
books = author_instance.books.all() # Використання `related_name`
for book in books:
print(book.title)
# Результат:
# Harry Potter and the Philosopher's Stone
# Harry Potter and the Chamber of Secrets
Отримання автора книги
# Отримання автора книги
book_instance = Book.objects.get(title="1984")
print(book_instance.author.name) # Результат: George Orwell
3. Багато до багатьох
Багато до багатьох (Many-to-Many Relationship) — це тип зв'язку, де багато записів з однієї таблиці можуть бути пов'язані з багатьма записами з іншої таблиці.
У Django для моделювання цього зв'язку використовується поле ManyToManyField
.
Сценарій:
Студенти та Курси: Студент може брати кілька курсів, а курс може мати кілька студентів.
from django.db import models
# Модель Категорії
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
# Модель Книги
class Book(models.Model):
title = models.CharField(max_length=200)
categories = models.ManyToManyField(Category, related_name='books') # Зв'язок багато до багатьох
def __str__(self):
return self.title
Приклад використання
Додавання нових книг та категорій
# Створення категорій
fiction = Category.objects.create(name="Fiction")
science = Category.objects.create(name="Science")
mystery = Category.objects.create(name="Mystery")
# Створення книги та прив'язка до категорій
book1 = Book.objects.create(title="The Hobbit")
book1.categories.add(fiction, mystery)
book2 = Book.objects.create(title="A Brief History of Time")
book2.categories.add(science)
Отримання книг за категорією
# Отримання всіх книг категорії
category_instance = Category.objects.get(name="Mystery")
books = category_instance.books.all() # Використання `related_name`
for book in books:
print(book.title)
# Результат:
# The Hobbit
# Sherlock Holmes: The Complete Series
ПІДСУМКИ
Django ORM дозволяє легко моделювати зв'язки бази даних за допомогою класів Python. Зв'язки між моделями важливі для організації та управління даними в логічному вигляді. У Django є три основні типи зв'язків:
- One-to-One (Один до одного): Зв'язок, де запис у двох таблицях може бути пов'язаний лише з одним іншим записом.
- Many-to-One (Багато до одного): Кілька записів з однієї таблиці можуть бути пов'язані з одним записом іншої таблиці.
- Many-to-Many (Багато до багатьох): Записи з двох таблиць можуть бути взаємно пов'язані.
Для зв'язків використовуються поля ForeignKey
, OneToOneField
та ManyToManyField
, щоб створювати моделі. Django ORM пропонує потужний інструмент для керування зв'язками та підтримки цілісності бази даних, спрощуючи при цьому обслуговування коду.
Перекладено з: Django ORM Model İlişkileri: Veritabanı İlişkilerini Yönetmenin Etkili Yolları