鍍金池/ 教程/ Python/ 關(guān)聯(lián)對象參考
點擊劫持保護
安全問題歸檔
Model 類參考
將遺留數(shù)據(jù)庫整合到Django
關(guān)聯(lián)對象參考
內(nèi)建基于類的視圖的API
聚合
Django 中的用戶認證
django.contrib.humanize
Django管理文檔生成器
分頁
使用Django輸出CSV
加密簽名
文件儲存API
安全
Django中的測試
國際化和本地化
為Django編寫首個補丁
條件表達式
日志
模型元選項
部署靜態(tài)文件
執(zhí)行查詢
使用Django認證系統(tǒng)
基于類的視圖
中間件
編寫自定義的django-admin命令
Django 的設置
格式本地化
數(shù)據(jù)庫訪問優(yōu)化
錯誤報告
基于類的內(nèi)建通用視圖
編寫自定義存儲系統(tǒng)
編寫你的第一個 Django 程序 第3部分
編寫數(shù)據(jù)庫遷移
使用表單
編寫你的第一個 Django 程序 第2部分
編寫你的第一個 Django 程序 第1部分
如何使用會話
系統(tǒng)檢查框架
新手入門
信號
編寫視圖
如何使用WSGI 部署
編寫你的第一個Django應用,第6部分
常見的網(wǎng)站應用工具
Widgets
內(nèi)建的視圖
模型實例參考
視圖層
Django中的密碼管理
高級教程:如何編寫可重用的應用
國際化和本地化
"本地特色"附加功能
TemplateResponse 和 SimpleTemplateResponse
模式編輯器
文件上傳
快速安裝指南
部署 Django
表單 API
表單素材 ( <code>Media</code> 類)
管理文件
其它核心功能
查找 API 參考
表單
Admin
數(shù)據(jù)庫函數(shù)
自定義查找
使用基于類的視圖處理表單
管理操作
開發(fā)過程
編寫你的第一個Django應用,第5部分
進行原始的sql查詢
模型層
多數(shù)據(jù)庫
編寫你的第一個 Django 程序 第4部分
Django安全
Django 初探
Django異常
重定向應用
按需內(nèi)容處理
管理器
視圖裝飾器
驗證器
使用Django輸出PDF
File對象
Django 的快捷函數(shù)
基于類的通用視圖 —— 索引
為模型提供初始數(shù)據(jù)
模板層
URL調(diào)度器
中間件
模型

關(guān)聯(lián)對象參考

class RelatedManager

"關(guān)聯(lián)管理器"是在一對多或者多對多的關(guān)聯(lián)上下文中使用的管理器。它存在于下面兩種情況:

ForeignKey關(guān)系的“另一邊”。像這樣:

from django.db import models

class Reporter(models.Model):
    # ...
    pass

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

在上面的例子中,管理器reporter.article_set擁有下面的方法。

ManyToManyField關(guān)系的兩邊:

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping)

這個例子中,topping.pizza_set 和pizza.toppings都擁有下面的方法。

add(obj1[, obj2, ...])

把指定的模型對象添加到關(guān)聯(lián)對象集中。

例如:

>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e) # Associates Entry e with Blog b.

在上面的例子中,對于ForeignKey關(guān)系,e.save()由關(guān)聯(lián)管理器調(diào)用,執(zhí)行更新操作。然而,在多對多關(guān)系中使用add()并不會調(diào)用任何 save()方法,而是由QuerySet.bulk_create()創(chuàng)建關(guān)系。如果你需要在關(guān)系被創(chuàng)建時執(zhí)行一些自定義的邏輯,請監(jiān)聽m2m_changed信號。

create(**kwargs)

創(chuàng)建一個新的對象,保存對象,并將它添加到關(guān)聯(lián)對象集之中。返回新創(chuàng)建的對象:

>>> 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)

要注意我們并不需要指定模型中用于定義關(guān)系的關(guān)鍵詞參數(shù)。在上面的例子中,我們并沒有傳入blog參數(shù)給create()。Django會明白新的 Entry對象blog 應該添加到b中。

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

從關(guān)聯(lián)對象集中移除執(zhí)行的模型對象:

>>> 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()可會執(zhí)行更新操作。但是,多對多關(guān)系上的remove(),會使用QuerySet.delete()刪除關(guān)系,意思是并不會有任何模型調(diào)用save()方法:如果你想在一個關(guān)系被刪除時執(zhí)行自定義的代碼,請監(jiān)聽m2m_changed信號。

對于ForeignKey對象,這個方法僅在null=True時存在。如果關(guān)聯(lián)的字段不能設置為None (NULL),則這個對象在添加到另一個關(guān)聯(lián)之前不能移除關(guān)聯(lián)。在上面的例子中,從b.entry_set()移除e等價于讓e.blog = None,由于blog的ForeignKey沒有設置null=True,這個操作是無效的。

對于ForeignKey對象,該方法接受一個bulk參數(shù)來控制它如果執(zhí)行操作。如果為True(默認值),QuerySet.update()會被使用。而如果bulk=False,會在每個單獨的模型實例上調(diào)用save()方法。這會觸發(fā)pre_save和post_save,它們會消耗一定的性能。

clear()

從關(guān)聯(lián)對象集中移除一切對象。

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

注意這樣不會刪除對象 —— 只會刪除他們之間的關(guān)聯(lián)。

就像 remove() 方法一樣,clear()只能在 null=True的ForeignKey上被調(diào)用,也可以接受bulk關(guān)鍵詞參數(shù)。

注意

注意對于所有類型的關(guān)聯(lián)字段,add()、create()、remove()和clear()都會馬上更新數(shù)據(jù)庫。換句話說,在關(guān)聯(lián)的任何一端,都不需要再調(diào)用save()方法。

同樣,如果你再多對多關(guān)系中使用了中間模型,一些關(guān)聯(lián)管理的方法會被禁用。

直接賦值

通過賦值一個新的可迭代的對象,關(guān)聯(lián)對象集可以被整體替換掉。

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list

如果外鍵關(guān)系滿足null=True,關(guān)聯(lián)管理器會在添加new_list中的內(nèi)容之前,首先調(diào)用clear()方法來解除關(guān)聯(lián)集中一切已存在對象的關(guān)聯(lián)。否則, new_list中的對象會在已存在的關(guān)聯(lián)的基礎上被添加。

上一篇:文件儲存API下一篇:File對象