добавил новое логическое поле в существующую модель django Mongoengine, но после не может фильтровать это поле - PullRequest
2 голосов
/ 29 сентября 2011

Сначала моя модель 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 []

Я делаю все поля is_cancelled в False с объектом django:

for x in List.objects.all():
    x.is_cancelled = False
    x.save()

Но я все еще получаю пустой список для запроса выше. Я просматриваю файл is_cancelled объекта django и вижу is_cancelled = False

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

Ложная

Но когда я смотрю из оболочки mongodb. Там нет поданной как 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")
    } ] }    

Как я могу исправить этот запрос

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Вуаля!

Это мой ответ:

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

В mongengine BooleanField имеется ошибка со значением False.

Но они исправили это с помощью этого патча:

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

0 голосов
/ 29 сентября 2011

Это потому, что mongoDB - это база данных без схемы.Хотя вы определили поле is_canceled в своей модели, это не означает, что все существующие документы будут обновлены с этим новым полем.Внутри коллекции не обязательно, чтобы каждый документ имел одинаковую структуру.

Если вы хотите, чтобы поле is_canceled в каждом из ваших существующих документов, вам нужно написать скрипт обновления, чтобы перебирать каждый документ в вашей коллекции идобавьте это поле.В противном случае только новые документы, созданные с помощью этой новой модели, будут содержать поле is_canceled.

Надеюсь, это поможет.

...