“Менеджер связанных объектов” – это менеджер, который используется для связей один-ко-многим и многие-ко-многим. Это происходит в двух случаях:
“Обратная связь” для ForeignKey. Например:
class Reporter(models.Model):
...
class Article(models.Model):
reporter = models.ForeignKey(Reporter)
В этом примере, методы описанные ниже будут доступны через менеджер reporter.article_set.
Для обоих сторон связи через ManyToManyField:
class Topping(models.Model):
...
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.
Создает новый объект, сохраняет его и добавляет к связанным объектам. Возвращает созданный объект:
>>> 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.
Для того, что бы предотвратить “поломку” данных в базе данных, этот метод предоставляется только для 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