3

首先我的 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 看时。没有归档为 is_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")
    } ] }    

如何修复此查询

4

2 回答 2

2

瞧!

这是我的回答:

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

mongengine BooleanField 中有一个值为 False 的错误。

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

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

于 2011-09-30T12:40:51.553 回答
0

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

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

希望这可以帮助。

于 2011-09-29T18:39:27.280 回答