如何从Mongoengine / Pymongo中的字典中自动删除键?

时间:2013-07-19 18:10:48

标签: python pymongo mongoengine atomicity

所以它主要是一个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命令有效。是否有另一种方法来删除它,我使用不正确的语法?

1 个答案:

答案 0 :(得分:1)

如果valVar是一个类的实例并由objectId存储 - 请尝试:

modelObject.update(**{'unset__dictField__' + keyVar: valVar.id })