Django ORM Моделі Зв’язків: Ефективні Шляхи Керування Зв’язками Бази Даних

Django, веб-застосунки забезпечує потужну систему зв'язку об'єктів з базою даних (Object-Relational Mapping — ORM).

pic

Що таке 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 є три основні типи зв'язків:

  1. One-to-One (Один до одного): Зв'язок, де запис у двох таблицях може бути пов'язаний лише з одним іншим записом.
  2. Many-to-One (Багато до одного): Кілька записів з однієї таблиці можуть бути пов'язані з одним записом іншої таблиці.
  3. Many-to-Many (Багато до багатьох): Записи з двох таблиць можуть бути взаємно пов'язані.

Для зв'язків використовуються поля ForeignKey, OneToOneField та ManyToManyField, щоб створювати моделі. Django ORM пропонує потужний інструмент для керування зв'язками та підтримки цілісності бази даних, спрощуючи при цьому обслуговування коду.

Перекладено з: Django ORM Model İlişkileri: Veritabanı İlişkilerini Yönetmenin Etkili Yolları

Leave a Reply

Your email address will not be published. Required fields are marked *