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)

私はdjango mongodb ORMにmongoengineを使用しています。しかし今、フィルタークエリを作成したいとき:

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 シェルから見ると。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

値がFalseのmongengineBooleanFieldにバグがあります。

しかし、彼らはこのパッチでそれを修正しました:

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 に答える