向现有django Mongoengine模型添加了新的布尔字段,但之后无法筛选此字段

向现有django Mongoengine模型添加了新的布尔字段,但之后无法筛选此字段,django,mongodb,django-models,mongoengine,database,Django,Mongodb,Django Models,Mongoengine,Database,首先,我的django模型是这样的: class List(Document): owner = ReferenceField('User') name = StringField() users = ListField(ReferenceField('User')) created_at = DateTimeField(default=datetime.datetime.now) 在我添加了一个新的文件后,它被取消了,现在是这样的: class List(Do

首先,我的django模型是这样的:

class List(Document):
    owner = ReferenceField('User')
    name = StringField()
    users = ListField(ReferenceField('User'))
    created_at = DateTimeField(default=datetime.datetime.now)
在我添加了一个新的文件后,它被取消了,现在是这样的:

class List(Document):
    owner = ReferenceField('User')
    name = StringField()
    users = ListField(ReferenceField('User'))
    created_at = DateTimeField(default=datetime.datetime.now)
    is_cancelled = BooleanField(default = False)
我将mongoengine用于django mongodb ORM。但现在,当我要进行筛选查询时:

List.objects.filter(is_cancelled=False)
returns []
我使用django对象将所有已取消字段设置为False:

for x in List.objects.all():
    x.is_cancelled = False
    x.save()
但对于上面的查询,我仍然得到一个空列表。 我正在查找django对象的is_cancelled字段,我看到is_cancelled=False

l = List.objects.all()[0]
l.is_cancelled
假的

但是当我从mongodb shell看的时候。没有被取消的文件

db.list.find()
{ "_cls" : "List", "_id" : ObjectId("4e8451598ebfa80228000000"), "_types" : [ "List" ],     
"created_at" : ISODate("2011-09-29T16:24:28.781Z"), "name" : "listname", "users" : [          
{
            "$ref" : "user",
            "$id" : ObjectId("4e79caf78ebfa80c00000001")
    },      {
            "$ref" : "user",
            "$id" : ObjectId("4e79e4df8ebfa80b64000001")
    },      {
            "$ref" : "user",
            "$id" : ObjectId("4e7aeb898ebfa80b64000001")
    },      {
            "$ref" : "user",
            "$id" : ObjectId("4e79ce028ebfa80c00000004")
    } ] }    

如何修复此查询?这是因为mongoDB是一个无模式的数据库。虽然您已经定义了在模型中取消该字段,但这并不意味着所有现有文档都将使用该新字段进行更新。在集合中,每个文档不需要遵循相同的结构

如果希望在每个现有文档中都有“已取消”字段,则需要编写一个更新脚本来遍历集合中的每个文档并添加该字段。否则,只有使用此新模型创建的新文档才会包含此字段

希望这有帮助。

我的答案是:

mongengine Boolean字段中存在一个值为False的错误

但是他们用这个补丁修复了它:


是的,我知道。但我用的是mongoengine。如果我想从django shell设置它:l.is_cancelled=False l.save()mongoengine不会将其写入mongodb,因为is_cancelled字段的默认值。但如果我将其设置为True:l.is_cancelled=True l.save(),它将写入mongodb。但在我重置为False并保存对象之后。mongoengine从mongodb中删除已取消的is_文件。我认为这是mongoengine ORM的一个缺陷。我使用mongoengine update命令解决这个问题:List.objects.update(set\u\u is\u cancelled=False)这个命令写入mongodb。我想当我想使用mongoengine ORM时,设置is_cancelled=False。它不会因为默认值而写入db,如果我需要该值,ıt会返回默认值,但是如果我想设置一个不同于默认值的值,它会写入mongodb。