2012-03-27 7 views
1

保存されます。私はこのような単純なドキュメント、定義されたStringFieldがユニークとして定義されていますが、重複が黙っ

class Company(Document): 
    screen_name = StringField(max_length=100, required=True, unique=True) 
    official_name = StringField(required=False) 

    meta = { 
     'indexes': [{'fields': 'screen_name', 'unique': True}] 
    } 

を私はテスト

@use_tdb 
def test_company3(): 
    """ test company2 """ 
    company = Company(screen_name='asdasd') 
    company.save() 
    company = Company(screen_name='asdasd') 
    with nt.assert_raises(OperationError): 
     company.save() 
     pprint([(x.id, x.screen_name,) for x in Company.objects.all()]) 

を書いていたときにそれが実際にそれらの両方を節約できます。そして私は出力で見る:

[(ObjectId('4f719f915c121a21ad000003'), u'asdasd'), 
(ObjectId('4f719f915c121a21ad000004'), u'asdasd')] 

私は間違って何をしましたか?

ありがとうございます。

答えて

2

これは、drop_collectionが必要な場合があります。

def test_company3(): 
    """ test company2 """ 
    Company.drop_collection() 
    company = Company(screen_name='asdasd') 
    company.save() 
    company = Company(screen_name='asdasd') 
    with nt.assert_raises(OperationError): 
     company.save() 
    pprint([(x.id, x.screen_name,) for x in Company.objects.all()]) 

このテストを参照してください。 Mongoengineはすべてのテストに合格します。 https://github.com/hmarr/mongoengine/blob/master/tests/document.py#L875

最近のレイド0.6.3。

+0

ありがとう、@アンカ、それは動作します!しかし、私はちょっと混乱しました。各テストでは、すでに各テストの前と後にすべてのコレクション( 'system.indexes'を除く)を削除する私のuse_tdbデコレータがありました。しかし、これは役に立たなかった。そしてmongoシェルから手動でテストDBを落としたとしても、問題はまだ残っていました。私はそれを得ることができません! db.dropDatabase()はdbを永久に削除しないで、次回のテストでmongodbは古​​いインデックスを選択しますか? –

+0

はい。古い索引は複雑で混乱します。あなたはmongoengineのテストを見ましたか?すべてのテスト開始の最初のコマンドはdrop_collectionです。それは、モンゴルとモンゴブの理解だけです。プロダクションでは使用しない:)。 – Ankhaa

+0

うん、それを持っていた!私は別の質問があります。 QuerySet._reset_already_indexed(document = Company)以外の既存のコレクション(開発またはプロダクションDB)のインデックスを再構築するエレガントな方法はありますか? –

関連する問題