Django模型中的Python工厂男孩库m2m?
我目前正在使用Django模型中的Python工厂男孩库m2m?,python,django,testing,factory,fixtures,Python,Django,Testing,Factory,Fixtures,我目前正在使用factory\u boy在测试中创建装置。 Factory\u boy文档只提到了子工厂,它可以像模型中的外键字段一样工作。然而,在许多人的交往中却没有任何东西。如果我有一个后续模型,我将如何为它创建一个工厂 class Post(models.Model): title = models.CharField(max_length=100) tags = models.ManyToManyField('tags.Tag') class PostFactory(f
factory\u boy
在测试中创建装置。
Factory\u boy
文档只提到了子工厂
,它可以像模型中的外键
字段一样工作。然而,在许多人的交往中却没有任何东西。如果我有一个后续模型,我将如何为它创建一个工厂
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 = ???
我没有测试它,但它有什么问题:
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)
您可以覆盖
\u prepare
类方法:
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
请注意,如果帖子没有ID,则无法将标签添加到帖子中。怎么样-我假设您使用的是更新版本的
随机导入
进口工厂
类工厂(工厂、工厂):
工厂=职位
标题=工厂顺序(lambda n:“这是测试标题编号”+n)
@工厂。生成后(提取前缀='tags')
def添加标签(自我、创建、提取、**kwargs):
#允许类似PostFactory的操作(tags=Tag.objects.filter())
如果提取并键入(提取)=type(Tag.objects.all()):
self.tags=已提取
self.save()
其他:
如果Tag.objects.all().count()小于5:
标记工厂。创建批次(5,**kwargs)
对于tag.objects.all().order_by('?')[:random.randint(1,5)]中的标记:
self.tags.add(标记)
请注意,您可以使用PostFactory(tags\uu field='some fancy default text')
,但我建议使用序列创建良好的TagFactory
您应该能够绑定
PostFactory(tags=Tag.objects.filter())
,但这部分没有经过测试…是的,可以。但是我想这样做:post=PostFactory(),假设会自动添加4个标记,而不必手动指定post.tags.add(tag),我认为factory不允许这样做。但是为什么不创建一个函数来为您实现这一点呢?def PostFactoryWithFourTags():post=PostFactory()用于xrange(4):post.tags.add(TagFactory()return postHey@Ngo你得到了一个有效的答案吗?@Daryl:重写_prepare似乎是最简单的解决方案:)
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)