首先我的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")
} ] }
如何修复此查询
答案 0 :(得分:2)
瞧!
这是我的答案:
https://github.com/hmarr/mongoengine/issues/282
mongengine BooleanField有一个错误,值为False。
但是他们用这个补丁修复了它:
答案 1 :(得分:0)
这是因为mongoDB是一个无模式的数据库。虽然您已在模型中定义了字段is_canceled,但这并不意味着将使用此新字段更新所有现有文档。在集合中,每个文档不需要遵循相同的结构。
如果您希望每个现有文档中都包含is_canceled字段,则需要编写更新脚本来迭代集合中的每个文档并添加该字段。否则,只有使用此新模型创建的新文档才会包含字段is_canceled。
希望这有帮助。