0

最初のオブジェクトをコレクションに保存しようとしています (最初のオブジェクトであることを確認するために db.connection.drop_database() を実行しました) が、*** NotUniqueError: Tried to save duplicate unique keysエラーが発生し続けます。

これが私が得るものの簡単な例です:

ipdb> Card.objects.all()  
[]  
ipdb> card  
`<Card: <Card url/pk: c569e1c9-7311-441e-ba03-0e86d4bc2932>>`  
ipdb> card.save()  
*** NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error index: contacts.dav_object.$username_1  dup key: { : null })  
ipdb> Card.drop_collection()  
ipdb> card.save()  
`<Card: <Card url/pk: c569e1c9-7311-441e-ba03-0e86d4bc2932>>`  
ipdb>

私は UnitTest を使用していますが、setUpメソッドにはCard.ensure_indexes(). 何か関係があるのではないかと思いますが、この行がないと、モデル定義にunique=True.

Card._collection.drop_indexes()この問題が解決した後に追加するCard.ensure_indexes()と、上記のようにエントリが重複します。

カードモデルは次のとおりです。

class Card(DavObject):  
    addressbook = db.ReferenceField("Addressbook")  
    url = db.StringField(required=True, unique=True, unique_with=["addressbook", "url"])  
    active = db.BooleanField(default=True)  
    text = db.StringField(required=True)  

DavObject は次のとおりです。

class DavObject(db.Document):
    meta = {
        'allow_inheritance': True,
    }

    last_update = db.ComplexDateTimeField(required=True, default=datetime.utcnow)

    def __unicode__(self):
        return u"<%s url/pk: %s>" % (self.__class__.__name__, getattr(self, "url", self.pk))

    def save(self, *args, **kwargs):
        if self._get_changed_fields():
            self.last_update = datetime.utcnow()
        return db.Document.save(self, *args, **kwargs)

何が悪いのかわかりません。

私はmongoengine 0.8.3、フラスコ0.10.1、およびpython 2.7.3を使用しています。

4

1 に答える 1

3

継承の問題のように見えます。設定すると、継承され'allow_inheritance': TrueDavObjectすべてのモデルが 1 つのコレクションに格納されます。

username継承されたモデルのインデックスがあり、継承された2 つのドキュメントを同じ(なし)でDavObject挿入しようとすると、競合が発生します。DavObjectusername

使用する必要があることを確認できない場合は'allow_inheritance': True、設定するFalseか、異なるインデックスを持つドキュメントを別のコレクションに配置してみてください。

私の仮定を確認するには、 を試してくださいprint list(DavObject.objects.all())

于 2013-08-09T21:47:34.587 に答える