Проверяет знание типов связей в реляционных базах данных и их реализацию в Django ORM.
Если книга может быть в нескольких магазинах, а магазин содержит много книг — это связь «многие ко многим» (ManyToMany). В Django её реализуют через ManyToManyField. При этом создаётся промежуточная таблица, которая хранит пары «магазин-книга».
Связь «многие ко многим» используется, когда:
Один объект (книга) принадлежит нескольким объектам (магазинам).
Один объект (магазин) содержит много объектов (книг).
Реализация в Django:
class Book(models.Model):
title = models.CharField(max_length=100)
class Shop(models.Model):
name = models.CharField(max_length=100)
books = models.ManyToManyField(Book) # Связь!
# Теперь можно делать:
shop = Shop.objects.get(name="Лабиринт")
shop.books.add(Book.objects.get(title="Гарри Поттер")) # Добавить книгуКак это работает в БД:
Django автоматически создаёт таблицу shop_books с колонками:
id (первичный ключ)
shop_id (внешний ключ на магазин)
book_id (внешний ключ на книгу)
Запросы для получения всех книг магазина:
shop.books.all() # Все книги конкретного магазина
book.shop_set.all() # Все магазины, где есть книгаДополнительные данные в связи:
Если нужно хранить дополнительные атрибуты (например, количество книг в магазине), создайте промежуточную модель:
class Stock(models.Model):
shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
quantity = models.IntegerField() # Доп. поле
class Shop(models.Model):
books = models.ManyToManyField(Book, through='Stock') # Через StockВывод:
ManyToManyField — стандартный способ для сложных связей.