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

djbook.ru | Главная | Содержание | Алфавитный указатель | Модули | Состояние перевода | Контрибьюторы | Как помочь с переводом? | Django 1.5
« 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.

В примере выше будет вызыван метод 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, это невозможно.

clear()¶

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

>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()

Заметим, что связанные объекты не удаляются – просто разрывается связь.

Так же как и remove(), clear() доступен только для ForeignKey с null=True.

Browse

  • Prev: Справочник по полям модели
  • Next: Параметры модели

You are here:

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

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

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

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

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

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

Mar 30, 2016

« previous | up | next »
Translated by   Ruslan Popov @ gmail.com   Dmitriy Kostochko @ gmail.com and other.
1.6
9bb03642e48099c6d3b801aa87b60c0dad0f61d8