Ответ
ManyToManyField — это тип поля в моделях Django, который используется для реализации связи "многие-ко-многим" (M:N). Он позволяет связать одну запись из одной таблицы с несколькими записями из другой, и наоборот.
Классический пример — авторы и книги: у одной книги может быть несколько авторов, и один автор может написать несколько книг.
Как это работает
Django автоматически создает промежуточную (junction) таблицу в базе данных для хранения этих связей. Эта таблица содержит внешние ключи (foreign keys) к обеим связываемым моделям.
Пример реализации
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
# Связываем модель Book с моделью Author
authors = models.ManyToManyField(Author, related_name='books')
def __str__(self):
return self.title
Управление связями
Для управления связями используются специальные методы менеджера отношений:
# Создаем объекты
author1 = Author.objects.create(name='George Orwell')
author2 = Author.objects.create(name='Aldous Huxley')
book = Book.objects.create(title='Brave New World')
# Добавление связи
book.authors.add(author2)
# Добавление нескольких связей
# book.authors.add(author1, author2)
# Получение всех авторов книги
# book.authors.all() -> <QuerySet [<Author: Aldous Huxley>]>
# Удаление связи
# book.authors.remove(author2)
# Полная очистка связей
# book.authors.clear()
Ключевые параметры
related_name: Позволяет обращаться к набору объектов из связанной модели (например,author.books.all()).through: Позволяет указать собственную, кастомную модель в качестве промежуточной таблицы, если нужно хранить дополнительные данные о связи (например, роль автора в написании книги).