为现有的django Mongoengine模型添加了新的布尔字段,但之后无法过滤此字段

时间:2011-09-29 14:12:33

标签: 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)

在我添加了一个新的is_cancelled文件之后,现在就是这样:

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对象将所有is_cancelled字段设为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看时。没有提交as_cancelled。

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")
    } ] }    

如何修复此查询

2 个答案:

答案 0 :(得分:2)

瞧!

这是我的答案:

https://github.com/hmarr/mongoengine/issues/282

mongengine BooleanField有一个错误,值为False。

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

https://github.com/hmarr/mongoengine/pull/283

答案 1 :(得分:0)

这是因为mongoDB是一个无模式的数据库。虽然您已在模型中定义了字段is_canceled,但这并不意味着将使用此新字段更新所有现有文档。在集合中,每个文档不需要遵循相同的结构。

如果您希望每个现有文档中都包含is_canceled字段,则需要编写更新脚本来迭代集合中的每个文档并添加该字段。否则,只有使用此新模型创建的新文档才会包含字段is_canceled。

希望这有帮助。