WEB框架-Django框架學習-關聯管理器(RelatedManager)

1、class RelatedManager

  "關聯管理器"是在一對多或者多對多的關聯上下文中使用的管理器。它存在於下面兩種狀況:python

  一、一對多

    ForeignKey關係的「另外一邊」。像這樣:數據庫

1
2
3
4
5
6
7
from django.db import models
  
class Publish(models.Model):
     pass
  
class Book(models.Model):
     publish = models.ForeignKey( "Publish" , on_delete = models.CASCADE)

    在上面的例子中,管理器publish_obj.book_set  會擁有下面介紹的方法。django

  二、多對多

    ManyToManyField關係的兩邊:post

1
2
3
4
5
6
class Author(models.Model):
     pass
 
 
class Book(models.Model):
     authors = models.ManyToManyField( "Author" )

    在這個例子中,book_obj.authors 和author_obj.book_set 都擁有下面的方法。this

  三、方法合集

    一、add(obj1[, obj2, ...])
複製代碼
把指定的模型對象添加到關聯對象集中。

例如:

>>> author_obj = Author.objects.get(id=1)
>>> book_obj = Book.objects.get(id=2)
>>> author_obj .book_set.add(e) 
在上面的例子中,對於ForeignKey關係,book_obj.save()由關聯管理器調用,執行更新操做。然而,在多對多關係中使用add()並不會調用任何 save()方法,而是由QuerySet.bulk_create()建立關係。

延伸:

# 1 *[]的使用
>>> book_obj = Book.objects.get(id=1)
>>> author_list = Author.objects.filter(id__gt=2)
>>> book_obj.authors.add(*author_list)


# 2 直接綁定主鍵
book_obj.authors.add(*[1,3])  # 將id=1和id=3的做者對象添加到這本書的做者集合中
                              # 應用: 添加或者編輯時,提交做者信息時能夠用到.
複製代碼
    二、create(**kwargs)
複製代碼
建立一個新的對象,保存對象,並將它添加到關聯對象集之中。返回新建立的對象:

>>> author_obj = Author.objects.get(id=1)
>>> book = author_obj.book_set.create(
    ...
    title='擠奶龍爪手',
    ...
)

# No need to call e.save() at this point -- it's already been saved.
這徹底等價於(不過更加簡潔於):

>>> author_obj = Author.objects.get(id=1)
>>> book = Book(
    ...
    title='擠奶龍爪手',
    ...
)
>>> author_obj.save(force_insert=True)
要注意咱們並不須要指定模型中用於定義關係的關鍵詞參數。在上面的例子中,咱們並無傳入author_obj參數給create()。Django會明白新的 Book對象author_obj 應該添加到author_obj中。
複製代碼
    三、remove(obj1[, obj2, ...])
從關聯對象集中移除執行的模型對象:

>>> author_obj = Author.objects.get(id=1)
>>> book_obj = Book.objects.get(id=2)
>>> author_obj .book_set.remove(book_obj) 
對於ForeignKey對象,這個方法僅在null=True時存在。
    四、clear()
複製代碼
從關聯對象集中移除一切對象。

>>> author_obj = Author.objects.get(id=1)
>>> author_obj.book_set.clear()
注意這樣不會刪除對象 —— 只會刪除他們之間的關聯。

就像 remove() 方法同樣,clear()只能在 null=True的ForeignKey上被調用。
複製代碼
    五、set()方法

    先清空,在設置,編輯書籍時便可用到。spa

book = models.Book.objects.filter(title="獨孤九劍").first()
book.authors.set([1, 3])  

注意:code

對於全部類型的關聯字段,add()、create()、remove()和clear(),set()都會立刻更新數據庫。換句話說,在關聯的任何一端,都不須要再調用save()方法。對象

相關文章
相關標籤/搜索