因此,这主要是一个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命令起作用了。还有另一种方法可以删除此错误,而我使用的语法不正确?
最佳答案
如果valVar
是类的实例并且由objectId存储-请尝试:
modelObject.update(**{'unset__dictField__' + keyVar: valVar.id })