“Менеджер связанных объектов” – это менеджер, который используется для связей один-ко-многим и многие-ко-многим. Это происходит в двух случаях:
“Обратная связь” для ForeignKey. Например:
from django.db import models
class Reporter(models.Model):
# ...
pass
class Article(models.Model):
reporter = models.ForeignKey(Reporter)
В этом примере, методы описанные ниже будут доступны через менеджер reporter.article_set.
Для обоих сторон связи через ManyToManyField:
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping)
В этом примере, методы описанные ниже будут доступны для менеджеров topping.pizza_set и pizza.toppings.
Эти менеджер содержат несколько дополнительных методов:
Добавляет указанный объект модели к множеству связанных объектов.
Например:
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e) # Associates Entry e with Blog b.
В примере выше будет вызыван метод e.save() для обновления данных. Однако использование add() для связей много-ко-многим не вызывает метод save(), а создает связывающие объекты с помощью QuerySet.bulk_create(). Если вам необходима дополнительная логика при обновлении связей, обрабатывайте сигнал m2m_changed.
Создает новый объект, сохраняет его и добавляет к связанным объектам. Возвращает созданный объект:
>>> b = Blog.objects.get(id=1)
>>> e = b.entry_set.create(
... headline='Hello',
... body_text='Hi',
... pub_date=datetime.date(2005, 1, 1)
... )
# No need to call e.save() at this point -- it's already been saved.
Аналогично (но значительно проще):
>>> b = Blog.objects.get(id=1)
>>> e = Entry(
... blog=b,
... headline='Hello',
... body_text='Hi',
... pub_date=datetime.date(2005, 1, 1)
... )
>>> e.save(force_insert=True)
Заметим, что не обязательно указывать аргумент для поля, которое определяет связь. В примере выше, мы не передавали аргумент blog для create(). Django самостоятельно определит, что поле blog нового объекта Entry должно содержать объект b.
Удаляет указанный объект из списка связанных объектов:
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.
Как и add(), для обновления данных вызывается метод e.save(). При использовании remove() для связей многое-ко-многим связи удаляются с помощью метода QuerySet.delete(), методмодели save() не вызывается. Если вам необходима дополнительная логика при обновлении связей, обрабатывайте сигнал m2m_changed.
Метод существует только для ForeignKey с null=True. Если внешний ключ не может быть установлен в None (NULL), объект не может быть удален из связи без добавления нового объекта. В примере выше, удаление e из b.entry_set() аналогично e.blog = None, и так как ForeignKey в blog не содержит null=True, это невозможно.
Удаляет все объекты из списка связанных:
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()
Заметим, что связанные объекты не удаляются – просто разрывается связь.
Так же как и remove(), clear() доступен только для ForeignKey с null=True.
Введите слова для поиска или имя модуля, класса или функции.
Mar 30, 2016