Python 如何在Mongoengine/Pymongo中自动从字典中删除密钥?
所以这主要是一个Mongoengine问题,但从错误的角度来看,问题似乎在底层pymongo层,所以我想我应该同时提到这两个问题。基本上我有一个这样的模型 编辑:更新以显示更多的类定义Python 如何在Mongoengine/Pymongo中自动从字典中删除密钥?,python,pymongo,mongoengine,atomicity,Python,Pymongo,Mongoengine,Atomicity,所以这主要是一个Mongoengine问题,但从错误的角度来看,问题似乎在底层pymongo层,所以我想我应该同时提到这两个问题。基本上我有一个这样的模型 编辑:更新以显示更多的类定义 class MyModel(Document): dictField = DictField() class PermHolder(Document): meta = {'allow_inheritance': True} .... class ValClass(PermHolder)
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 })
如果
valVar
是一个类的实例并由objectId存储,请尝试:
modelObject.update(**{'unset__dictField__' + keyVar: valVar.id })
什么是valVar?它不能被编码?它是一个类实例吗?你能生成一个完整的测试用例吗?我更新了它以包含完整的测试用例。这就是我所说的valVar——它不能被编码——它是一个类实例吗?你能生成一个完整的测试用例吗?我更新了它以包含完整的测试用例。这正是我所说的有效的方法!为什么valVar不起作用,但是valVar.id起作用了?实际上,unset不接受一个值,它只是一个值,但如果您将其设置为doc,它会修复。正确的方法是:
modelObject.update(**{unset\uuuuu dictField\uuuuuuu'+keyVar:1})
这很有效!为什么valVar不起作用,但是valVar.id起作用了?实际上,unset不接受一个值,它只是一个值,但如果您将其设置为doc,它会修复。正确的方法是:modelObject.update(**{'unset\uuuu dictField\uuuuu'+keyVar:1})