Документация Django 1.8

djbook.ru | Главная | Содержание | Алфавитный указатель | Модули | Состояние перевода | Контрибьюторы | Как помочь с переводом? | Django 1.7
« previous | up | next »

Работа со связанными объектами¶

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(obj1[, obj2, ...])¶

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

Например:

>>> 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 самостоятельно определит, что поле blog нового объекта Entry должно содержать объект b.

remove(obj1[, obj2, ...])¶

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

>>> 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, это невозможно.

Для объектов 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 будут добавлены к списку существующих объектов.

Оглавление

  • Работа со связанными объектами
    • Непосредственная смена значения

Browse

  • Prev: Model _meta API
  • Next: Справочник класса Model

You are here:

  • Документация Django 1.8
    • Справочник API
      • Модели
        • Работа со связанными объектами

На этой странице

  • Исходный текст

Быстрый поиск

Введите слова для поиска или имя модуля, класса или функции.

Последнее обновление:

Jun 02, 2016

« previous | up | next »
Translated by   Ruslan Popov   Dmytro Kostochko and other.
1.8 | 01 Jun 2016 23:14:52
f0f96de57de1e0f8bfad36e0f6a5a5c8b2f777ec