因此,这主要是一个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 })

10-06 07:52