Spec-Zone.ru › Django 1.8

Ссылка на связанные объекты

class RelatedManager

«Связанный менеджер» — это менеджер, используемый в контексте связи «один ко многим» или «многие ко многим». Это происходит в двух случаях:

  • «Другая сторона» связи 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.

add(*objs)

Добавляет указанные объекты модели в набор связанных объектов.

Пример:

>>> 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.

create(**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.

remove(*objs)

Удаляет указанные объекты модели из набора связанных объектов:

>>> 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, и поскольку blog ForeignKey не имеет null=True, это недопустимо.

Для объектов ForeignKey этот метод принимает аргумент bulk для управления выполнением операции. Если True (по умолчанию), используется QuerySet.update(). Если bulk=False, вместо этого вызывается метод save() каждого отдельного экземпляра модели. Это запускает сигналы pre_save и post_save и влечет за собой снижение производительности.

clear()

Удаляет все объекты из набора связанных объектов:

>>> 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API