Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型中的Python工厂男孩库m2m?_Python_Django_Testing_Factory_Fixtures - Fatal编程技术网

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)