Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Mongoengine/Pymongo中自动从字典中删除密钥?_Python_Pymongo_Mongoengine_Atomicity - Fatal编程技术网

Python 如何在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)

所以这主要是一个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 })

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