2013-07-19 48 views
1

所以它主要是一個Mongoengine的問題,但看着這個問題似乎是在基礎pymongo層的錯誤,所以我想我應該提及兩者。基本上我有這樣的 編輯模式:更新以顯示更多的類定義如何自動從Mongoengine/Pymongo的字典中刪除密鑰?

class MyModel(Document): 
    dictField = DictField() 

class PermHolder(Document): 
    meta = {'allow_inheritance': True} 
    .... 

class ValClass(PermHolder): 
    .... 

,並在我的代碼我試圖通過操縱原子更新該字典(我收到奇怪的比賽條件的問題當嘗試正常的方法和保存)。此外,由於密鑰是一個變量,我不得不使用kwargs作爲我的論點進入更新功能

modelObject = MyModel.objects.get(id=blah) 
valVar = ValClass.objects.get(id=blah) 

# This works at adding the binding modelObject[keyVar] = valVar 
modelObject.update(**{'set__dictField__' + keyVar: valVar }) 
... 
# Trying to remove the binding later on 
modelObject.update(**{'unset__dictField__' + keyVar: valVar }) 

所以第二個電話時,我嘗試刪除給我的錯誤

Cannot encode object: <ValClass: 51e94b55bc616310e5e4f3fb> 

這是奇怪的因爲set命令起作用了。是否有另一種方法來消除這一點,我使用不正確的語法?

+0

什麼是valVar - 它不能進行編碼 - 它是一個類的實例?你能製作一個完整的測試用例嗎? – Ross

+0

我更新了它以包含完整的測試用例。這實際上是我所說的 –

回答

1

如果valVar是一個類的實例,並存儲在由OBJECTID - 嘗試:

modelObject.update(**{'unset__dictField__' + keyVar: valVar.id }) 
+0

這工作!爲什麼valVar不工作,但valVar.id做到了? –

+0

這是一個錯誤 - 已添加https://github.com/MongoEngine/mongoengine/issues/416 – Ross

+0

實際上,未設置不值得它只是取消一個值 - 但會修復,因爲你確實將它設置爲一個文檔。正確的方法是:'modelObject.update(** {'unset__dictField__'+ keyVar:1})' – Ross