2013-01-15 8 views
5

私はテストのためにいくつかのMongoEngineドキュメントを生成するためにfactory_boyを使用しようとしています。 EmbeddedDocumentFieldオブジェクトの定義に問題があります。ここでfactory_boyを使ってMongoEngine EmbeddedDocumentをモデル化するにはどうしたらいいですか?

は私MongoEngine Documentです:commentsフィールドを指定する方法を

class CommentFactory(factory.Factory): 
    FACTORY_FOR = Comment 
    content = "Platinum coins worth a trillion dollars are great" 
    name = "John Doe" 

class BlogFactory(factory.Factory): 
    FACTORY_FOR = Blog 
    title = "On Using MongoEngine with factory_boy" 
    tags = ['python', 'mongoengine', 'factory-boy', 'django'] 
    comments = [factory.SubFactory(CommentFactory)] # this doesn't work 

任意のアイデア:

class Comment(EmbeddedDocument): 
    content = StringField() 
    name = StringField(max_length=120) 

class Post(Document): 
    title = StringField(required=True) 
    tags = ListField(StringField(), required=True) 
    comments = ListField(EmbeddedDocumentField(Comment)) 

ここに私の部分的に完成さfactory_boy Factoryですか?問題はfactory-boyがComment EmbeddedDocumentを作成しようとしていることです。

答えて

2

今私がやっていることは、組み込みドキュメントに基づいたファクトリがビルドされないようにすることです。

class CommentFactory(EmbeddedDocumentFactory): 

    FACTORY_FOR = Comment 

    content = "Platinum coins worth a trillion dollars are great" 
    name = "John Doe" 

はこれが最善の解決策ではないかもしれないので、私はよ:その後、私はEmbeddedDocumentsのためのファクトリを作成することを継承

class EmbeddedDocumentFactory(factory.Factory): 

    ABSTRACT_FACTORY = True 

    @classmethod 
    def _prepare(cls, create, **kwargs):           
     return super(EmbeddedDocumentFactory, cls)._prepare(False, **kwargs) 

を:だから、私はそうのように、アップEmbeddedDocumentFactoryセットアップをしましたこれを答えとして受け入れる前に、他の誰かが応答するのを待つ。

3

私は、これはあなたが望むものであるのかはわからないが、私はちょうどこの問題を見て開始し、これが動作しているようです:

from mongoengine import EmbeddedDocument, Document, StringField, ListField, EmbeddedDocumentField 
import factory 

class Comment(EmbeddedDocument): 
    content = StringField() 
    name = StringField(max_length=120) 

class Post(Document): 
    title = StringField(required=True) 
    tags = ListField(StringField(), required=True) 
    comments = ListField(EmbeddedDocumentField(Comment)) 


class CommentFactory(factory.Factory): 
    FACTORY_FOR = Comment 
    content = "Platinum coins worth a trillion dollars are great" 
    name = "John Doe" 

class PostFactory(factory.Factory): 
    FACTORY_FOR = Post 
    title = "On Using MongoEngine with factory_boy" 
    tags = ['python', 'mongoengine', 'factory-boy', 'django'] 
    comments = factory.LazyAttribute(lambda a: [CommentFactory()]) 

>>> b = PostFactory() 
>>> b.comments[0].content 
'Platinum coins worth a trillion dollars are great' 

私も何かが欠けていた場合、私は驚かないだろう。

+0

メインファクトリを初期化するときに、埋め込みドキュメントファクトリのファクトリを作成するために最初に含まれていた人物が含まれているため、EmbeddedDocumentFactoryをインクルードする必要があります。 –

関連する問題