Ссылка на связанные объекты ¶
-
класс
RelatedManager
¶ «Связанный менеджер» - это менеджер, используемый в связанном контексте «один ко многим» или «многие ко многим». Это происходит в двух случаях:
«Другая сторона»
ForeignKey
отношений. Это:from django.db import models class Blog(models.Model): # ... pass class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE, null=True)
В приведенном выше примере в диспетчере будут доступны указанные ниже методы
blog.entry_set
.Обе стороны
ManyToManyField
отношения:class Topping(models.Model): # ... pass class Pizza(models.Model): toppings = models.ManyToManyField(Topping)
В этом примере методы, указанные ниже, будут доступны как во включенном, так
topping.pizza_set
и во включенном состоянииpizza.toppings
.
-
add
( * objs , bulk = True , through_defaults = None ) ¶ Добавляет указанные объекты модели в набор связанных объектов.
Пример:
>>> b = Blog.objects.get(id=1) >>> e = Entry.objects.get(id=234) >>> b.entry_set.add(e) # Associates Entry e with Blog b.
В приведенном выше примере в случае
ForeignKey
отношенияQuerySet.update()
используется для выполнения обновления. Это требует, чтобы объекты уже были сохранены.Вы можете использовать
bulk=False
аргумент, чтобы вместо этого связанный менеджер выполнял обновление, вызываяe.save()
.Однако использование
add()
с отношением «многие ко многим» не вызывает никакихsave()
методов (bulk
аргумент не существует), а скорее создает отношения с использованиемQuerySet.bulk_create()
. Если вам нужно выполнить некоторую настраиваемую логику при создании отношения, прислушайтесь кm2m_changed
сигналу, который вызовет срабатываниеpre_add
иpost_add
действия.Использование
add()
уже существующего отношения не будет дублировать отношение, но по-прежнему будет запускать сигналы.Для отношений «многие ко многим»
add()
в качестве*objs
аргумента принимаются либо экземпляры модели, либо значения полей, обычно первичные ключи .При необходимости используйте
through_defaults
аргумент, чтобы указать значения для новых промежуточных экземпляров модели . Вы можете использовать вызываемые объекты как значения вthrough_defaults
словаре, и они будут оцениваться один раз перед созданием любого промежуточного экземпляра (ов).Изменено в Django 3.1:through_defaults
значения теперь могут быть вызываемыми.
-
create
( through_defaults = Нет , ** kwargs ) ¶ Создает новый объект, сохраняет его и помещает в набор связанных объектов. Возвращает вновь созданный объект:
>>> 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
.При необходимости используйте
through_defaults
аргумент, чтобы указать значения для нового промежуточного экземпляра модели . Вы можете использовать вызываемые объекты как значения вthrough_defaults
словаре.Изменено в Django 3.1:through_defaults
значения теперь могут быть вызываемыми.
-
remove
( * objs , bulk = True ) ¶ Удаляет указанные объекты модели из набора связанных объектов:
>>> 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
сигнал, если вы хотите выполнить пользовательский код при удалении отношения.Для отношений «многие ко многим»
remove()
в качестве*objs
аргумента принимаются либо экземпляры модели, либо значения полей, обычно первичные ключи .Для
ForeignKey
объектов этот метод существует только в том случае, еслиnull=True
. Если связанное поле не может быть установлено вNone
(NULL
), то объект не может быть удален из отношения без добавления к другому. В приведенном выше примере удалениеe
изb.entry_set()
эквивалентно выполнению , а поскольку его нет , это недопустимо.e.blog = None
blog
ForeignKey
null=True
Для
ForeignKey
объектов этот метод принимаетbulk
аргумент для управления выполнением операции. ЕслиTrue
(по умолчанию),QuerySet.update()
используется. Еслиbulk=False
, тоsave()
метод каждого отдельного экземпляра модели называется вместо этого. Это запускаетpre_save
иpost_save
сигналы и происходит за счет производительности.Для отношений «многие ко многим»
bulk
аргумент ключевого слова не существует.
-
clear
( bulk = True ) ¶ Удаляет все объекты из набора связанных объектов:
>>> b = Blog.objects.get(id=1) >>> b.entry_set.clear()
Обратите внимание, что это не удаляет связанные объекты, а просто разъединяет их.
Точно так же
remove()
,clear()
доступен только вForeignKey
s wherenull=True
и также принимаетbulk
аргумент ключевого слова.Для отношений «многие ко многим»
bulk
аргумент ключевого слова не существует.
-
set
( objs , bulk = True , clear = False , through_defaults = None ) ¶ Заменить набор связанных объектов:
>>> new_list = [obj1, obj2, obj3] >>> e.related_set.set(new_list)
Этот метод принимает
clear
аргумент для управления выполнением операции. ЕслиFalse
(по умолчанию), элементы, отсутствующие в новом наборе, удаляются с помощьюremove()
и добавляются только новые. Еслиclear=True
, тоclear()
вызывается метод , а и весь набор добавляется сразу.Для
ForeignKey
объектовbulk
аргумент передается вadd()
иremove()
.Для отношений «многие ко многим»
bulk
аргумент ключевого слова не существует.Обратите внимание, что, поскольку
set()
это составная операция, она подвержена условиям гонки. Например, новые объекты могут быть добавлены в базу данных между вызовомclear()
и вызовомadd()
.Для отношений «многие ко многим»
set()
в качествеobjs
аргумента принимает список экземпляров модели или значений полей, обычно первичных ключей .При необходимости используйте
through_defaults
аргумент, чтобы указать значения для новых промежуточных экземпляров модели . Вы можете использовать вызываемые объекты как значения вthrough_defaults
словаре, и они будут оцениваться один раз перед созданием любого промежуточного экземпляра (ов).Изменено в Django 3.1:through_defaults
значения теперь могут быть вызываемыми.
Примечание
Следует отметить , что
add()
,create()
,remove()
,clear()
иset()
применяются все базы данных немедленно изменяет для всех типов смежных областях. Другими словами, нет необходимости вызыватьsave()
кого-либо из сторон отношений.Если вы используете
prefetch_related()
, тоadd()
,remove()
,clear()
иset()
методу очистки упреждающего кэша.