Метод add
Метод add применяется к менеджеру отношений
ManyToManyField и добавляет указанные объекты в
связь многие-ко-многим. Метод принимает один или
несколько аргументов - объекты модели или их
первичные ключи. При вызове метода новые связи
создаются в промежуточной таблице, а существующие
дубликаты игнорируются.
Синтаксис
instance.related_field.add(obj1, obj2, ...)
Пример
Допустим, у нас есть модели Article и Category
со связью ManyToMany. Давайте добавим категории
к конкретной статье:
from myapp.models import Article, Category
# Get article and categories
article = Article.objects.get(pk=1)
category1 = Category.objects.get(name="Technology")
category2 = Category.objects.get(name="Science")
# Add categories to article
article.categories.add(category1, category2)
После выполнения этого кода статья будет связана с категориями "Technology" и "Science". Если попытаться добавить уже существующую связь, она не будет создана повторно.
Пример
Метод add также принимает первичные ключи
объектов вместо самих объектов. Это может быть
полезно для оптимизации производительности,
чтобы избежать лишних запросов к базе данных:
from myapp.models import Article
# Get article
article = Article.objects.get(pk=1)
# Add categories by their primary keys
article.categories.add(3, 5, 7)
В этом примере к статье добавляются категории с ID 3, 5 и 7. Метод автоматически определяет, что переданы первичные ключи, и выполняет вставку соответствующих связей.
Пример
Метод add можно использовать для добавления
всех объектов из QuerySet, используя оператор
распаковки *:
from myapp.models import Article, Category
# Get article and all categories
article = Article.objects.get(pk=1)
all_categories = Category.objects.filter(status="active")
# Add all categories to article
article.categories.add(*all_categories)
В результате все активные категории будут добавлены к статье. Это удобно, когда нужно добавить множество объектов одним вызовом.
Пример
Метод add можно использовать для добавления
связей через промежуточную модель с дополнительными
полями. Для этого нужно создать экземпляр
промежуточной модели и сохранить его:
from myapp.models import Article, Category, ArticleCategory
# Get article and category
article = Article.objects.get(pk=1)
category = Category.objects.get(name="Technology")
# Create through model instance with extra field
article_category = ArticleCategory(
article=article,
category=category,
added_by="admin"
)
article_category.save()
После сохранения связи в промежуточной таблице
появится запись с полем 'added_by'.
Смотрите также
-
метод
remove,
который удаляет объекты из связи ManyToMany -
метод
clear,
который удаляет все связи из отношения ManyToMany -
метод
set,
который заменяет набор связанных объектов -
поле
ManyToManyField,
которое определяет отношение многие-ко-многим в модели