2012-04-23 13 views
10

私は現在、テストで灯具を作成するのにfactory_boyを使用しています。 Factory_boy文書は、モデル内でForeignKeyフィールドのように機能する約SubFactoryしか言及していません。しかし、ManyToMany関連には何もなかった。私が次のポストモデルを持っていたら、その工場を作るためにどうすればいいですか?Python factory_boyライブラリDjangoモデルのm2m?

class Post(models.Model): 
    title = models.CharField(max_length=100) 
    tags = models.ManyToManyField('tags.Tag') 

class PostFactory(factory.Factory): 
    FACTORY_FOR = Post 

    title = 'My title' 
    tags = ??? 
+0

ねえ@ Ngoあなたは働いた答えを得ましたか? – Daryl

+0

@Daryl:_prepareをオーバーライドするのが最も簡単な解決策です:) –

答えて

2

私はそれをテストしていないが、との問題です:あなたがにタグを追加することはできません

class PostFactory(Factory): 
    FACTORY_FOR = Post 

    title = 'My title' 

    @classmethod 
    def _prepare(cls, create, **kwargs): 
     post = super(PostFactory, cls)._prepare(create, **kwargs) 
     if post.id: 
      post.tags = Tag.objects.all() 
     return post 

注:_prepareクラスメソッドをオーバーライドすることができます

class PostFactory(factory.Factory): 
    FACTORY_FOR = Post 
    title = 'My title' 

class TagFactory(factory.Factory): 
    FACTORY_FOR = Tag 

post = PostFactory() 
tag = TagFactory() 
post.tags.add(tag) 
+1

うん、それは動作します。 Post = PostFactory()とすると、手動でpost.tags.add(タグ)を指定しなくても、自動的に4つのタグが追加されます。 –

+0

factory_boyが許可しているとは思いません。しかし、なぜあなたはあなたのためにそれを行う関数を作成しないでください? def PostFactoryWithFourTags(): post = PostFactory() for _ xrange(4): post.tags.add(TagFactory() リターンポスト – Ale

7

は、ポストにIDがない場合はポスト。

11

何についてpost_generation hook - 私はfactory_boyの新しいバージョンを使用しますか?あなたは、私がシーケンスとの良好なTagFactoryを作成することをお勧めしますが、PostFactory(tags__field = 'some fancy default text')を使用することができます

import random 
import factory 

class PostFactory(factory.Factory): 
    FACTORY_FOR = Post 
    title = factory.Sequence(lambda n: "This is test title number" + n) 
    @factory.post_generation(extract_prefix='tags') 
    def add_tags(self, create, extracted, **kwargs): 
     # allow something like PostFactory(tags = Tag.objects.filter()) 
     if extracted and type(extracted) == type(Tag.objects.all()): 
      self.tags = extracted 
      self.save() 
     else: 
      if Tag.objects.all().count() < 5: 
       TagFactory.create_batch(5, **kwargs) 
      for tag in Tag.objects.all().order_by('?')[:random.randint(1, 5)]: 
       self.tags.add(tag) 

注...

あなたはPostFactory(tags = Tag.objects.filter())をバインドすることができるはずですが、この部分がテストされていません...

関連する問題