2013-07-19 1 views
1

그래서 주로 Mongoengine 질문이지만이 문제는 근본적인 pymongo 레이어에있는 것 같습니다. 그래서 나는 둘 다 언급해야한다고 생각합니다. 기본적으로 내가이 편집과 같은 모델이 : 클래스의 자세한 내용을 표시하도록 업데이트를Mongoengine/Pymongo의 사전에서 키를 원자 적으로 제거하는 방법은 무엇입니까?

class MyModel(Document): 
    dictField = DictField() 

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

class ValClass(PermHolder): 
    .... 

을 정의 내 코드에서 나는 원자 업데이트를 사용하여 그 사전을 조작하기 위해 노력하고있어 (내가 전에 이상한 경쟁 조건의 문제가 있었다 정상적인 방법을 시도하고 저장할 때). 키는 변수가 있기 때문에, 나는 제거하려고 할 때 업데이트 기능으로 내 인수로 두 번째 통화

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

그래서를 kwargs로를 사용하는 나에게 이상한 오류

Cannot encode object: <ValClass: 51e94b55bc616310e5e4f3fb> 

를 제공했다 set 명령이 작동했기 때문입니다. 이것을 제거하는 또 다른 방법이 있으며 잘못된 구문을 사용하고 있습니까? valVar 만약

+0

이 판막 무엇입니까 - 그것은 인코딩 할 수없는 -이 클래스의 인스턴스입니다? 전체 테스트 케이스를 제작할 수 있습니까? – Ross

+0

전체 테스트 케이스를 포함하도록 업데이트했습니다. 그것은 내가 말한 그대로의 것입니다 –

답변

1

는 클래스의 인스턴스이며, OBJECTID로 저장 - 시도 :

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

그게 효과가! valVar가 작동하지 않고 valVar.id가 작동하는 이유는 무엇입니까? –

+0

버그가 있습니다. https://github.com/MongoEngine/mongoengine/issues/416 – Ross

+0

사실, unset은 값을 가져 오지 못하지만, 문서로 설정하면 문제가 해결됩니다. 올바른 방법은 다음과 같습니다 :'modelObject.update (** { 'unset__dictField__'+ keyVar : 1})' – Ross