Ссылка на связанные объекты
-
«Связанный менеджер» — это менеджер, используемый в контексте связи «один ко многим» или «многие ко многим». Это происходит в двух случаях:
-
«Другая сторона» связи
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.
В примере выше, в случае связи
ForeignKey,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 определяет, что полеEntryнового объектаblogдолжно быть установлено в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, и посколькуblogForeignKeyне имеетnull=True, это недопустимо.Для объектов
ForeignKeyэтот метод принимает аргументbulkдля управления выполнением операции. ЕслиTrue(по умолчанию), используетсяQuerySet.update(). Еслиbulk=False, вместо этого вызывается методsave()каждого отдельного экземпляра модели. Это запускает сигналыpre_saveиpost_saveи влечет за собой снижение производительности.
-
Удаляет все объекты из набора связанных объектов:
>>> b = Blog.objects.get(id=1) >>> b.entry_set.clear()
Обратите внимание, что это не удаляет связанные объекты — это просто разрывает ассоциации.
Как и
remove(),clear()доступен только дляForeignKey, гдеnull=True, и также принимает ключевой аргументbulk.
Примечание
Обратите внимание, что
add(),create(),remove(), иclear()немедленно применяют изменения в базе данных для всех типов связанных полей. Другими словами, нет необходимости вызыватьsave()с любой стороны связи.Также, если вы используете промежуточную модель для связи «многие ко многим», некоторые методы связанного менеджера отключены.
-
Прямая присваивание
Набор связанных объектов может быть заменен оптом одной операцией, присвоив ему новый итерируемый объект:
>>> new_list = [obj1, obj2, obj3] >>> e.related_set = new_list
Если связь внешнего ключа имеет null=True, то связанный менеджер сначала вызовет clear() для разрыва ассоциаций с существующими объектами в связанном наборе, прежде чем добавить содержимое new_list. В противном случае объекты в new_list будут добавлены к существующему связанному набору объектов.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/models/relations/