所以它主要是一个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 :(得分:1)
如果valVar
是一个类的实例并由objectId存储 - 请尝试:
modelObject.update(**{'unset__dictField__' + keyVar: valVar.id })