2011-11-30 105 views
0

我有一個名爲Goal的模型,另一個名爲Action。這裏我強調一下重要的部分:Django - 反序列化保存ManyToMany字段的對象

class Goal(models.Model): 
    leaders = models.ManyToManyField(User, null=True) 

class Action(models.Model): 
    before = models.TextField(null=True) 
    after = models.TextField(null=True) 

當用戶編輯一個目標時,我保存一個新的Action對象。此Action對象的屬性之一是之前和之後。之前和之後都是序列化的目標對象。他們稍後將用於記錄Goal對象中發生了什麼變化。

所有屬性正常工作(如標題和描述),問題是所謂的「領袖」一個多對多場,當我反序列化目標對象有:

before = action.before 
for obj in serializers.deserialize("xml", before): 
    before_object = obj 
after = action.after 
for obj in serializers.deserialize("xml", after): 
    after_object = obj 

,並嘗試與訪問領導人場:

before_object_leaders = before_object.object.leaders.all() 
after_object_leaders = after_object.object.leaders.all() 
leaders_updated = True 
if set(before_object_leaders) == set(after_object_leaders): 
    leaders_updated = False 

before_object_leaders獲取目標表爲目標對象的當前值,而不是在反序列化對象,這就是我想要的價值。 (舊值,更新前)

請幫忙,我瘋了。謝謝!

回答

0

這裏的問題是,只要你打電話給:before_object.object.leaders你會得到一個ModelManager,當你調用方法all()時,將會產生新的DB查詢!那就是ModelManager的默認行爲。

因此,要解決您的問題,您必須在Model對象中編寫一個新的管理器。這位經理將負責領導人的反序列化。

這裏是一些參考:

https://docs.djangoproject.com/en/dev/topics/db/managers/

+0

嘿,非常感謝亞瑟!你的評論讓我意識到了這個問題,我是Django的新手,所以我不知道leaders.all()實際上是再次查詢數據庫。 :) – thyagx