一、class RelatedManager
"關聯管理器"是在一對多或者多對多的關聯上下文中使用的管理器。它存在於下面兩種情況:
1、一對多
ForeignKey關系的“另一邊”。像這樣:
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 會擁有下面介紹的方法。
2、多對多
ManyToManyField關系的兩邊:
class Author(models.Model):
pass
class Book(models.Model):
authors = models.ManyToManyField("Author")
在這個例子中,book_obj.authors 和author_obj.book_set 都擁有下面的方法。
3、方法合集
1、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的作者對象添加到這本書的作者集合中 # 應用: 添加或者編輯時,提交作者信息時可以用到.
2、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中。
3、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時存在。
4、clear()
從關聯對象集中移除一切對象。 >>> author_obj = Author.objects.get(id=1) >>> author_obj.book_set.clear() 注意這樣不會刪除對象 —— 只會刪除他們之間的關聯。 就像 remove() 方法一樣,clear()只能在 null=True的ForeignKey上被調用。
5、set()方法
先清空,在設置,編輯書籍時即可用到。
book = models.Book.objects.filter(title="獨孤九劍").first() book.authors.set([1, 3])
注意:
對於所有類型的關聯字段,add()、create()、remove()和clear(),set()都會馬上更新數據庫。換句話說,在關聯的任何一端,都不需要再調用save()方法。
