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

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

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

class RelatedManager¶

“Менеджер связанных объектов” – это менеджер, который используется для связей один-ко-многим и многие-ко-многим. Это происходит в двух случаях:

  • “Обратная связь” для ForeignKey. Например:

    class Reporter(models.Model):
        ...
    
    class Article(models.Model):
        reporter = models.ForeignKey(Reporter)
    

    В этом примере, методы описанные ниже будут доступны через менеджер reporter.article_set.

  • Для обоих сторон связи через ManyToManyField:

    class Topping(models.Model):
        ...
    
    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.
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.

Для того, что бы предотвратить “поломку” данных в базе данных, этот метод предоставляется только для 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.4
    • Справочник API
      • Модели
        • Работа со связанными объектами

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

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

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

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

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

Mar 30, 2016

« previous | up | next »
Translated by     Ruslan Popov @ gmail.com     Dmitriy Kostochko @ gmail.com