首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为具有TaggableManager字段的模型创建工厂-男孩工厂

如何为具有TaggableManager字段的模型创建工厂-男孩工厂
EN

Stack Overflow用户
提问于 2014-11-11 21:46:40
回答 2查看 1.6K关注 0票数 2

如何从django-taggit在Factory-Boy to TaggableManager中创建一个字段?

以下内容不起作用:

首先:

代码语言:javascript
复制
class ExperimentFactory(factory.DjangoModelFactory):
    class Meta:
        model = Experiment
        django_get_or_create = ('owner', 'name', 'start_date', 'stop_date', )

    owner = factory.SubFactory(UserFactory)
    name = factory.Sequence(lambda n : 'Experiment %s' % n)

    start_date = fuzzy.FuzzyDate(start_date=datetime.date(2003, 2, 1), 
                                     end_date = datetime.date.today() + timedelta(days=4*52*7+5))

    tags = [u'abc, cde', u'xzy']

错误是: TypeError:'tags‘是此函数的无效关键字参数

第二:(使用factory.post_generation)。所以不是最后一行,而是

代码语言:javascript
复制
@factory.post_generation
def post_tags(self, create, extracted, **kwargs):
    self.tags = [u'abc, cde', u'xzy']
    # self.save() # This does not have any effects

I get as result by Experiment.objects.get(pk=1).tags is []

有关详细信息,请参阅:

TestCase中对象的测试是:

代码语言:javascript
复制
experiment = ExperimentFactory(owner = self.user)
saved_experiment = Experiment.objects.get(name=experiment.name) 

self.assertEquals(len(experiment.tags), len(saved_experiment.tags.all())) # AssertError: 2 != 0
self.assertItemsEqual(experiment.tags, saved_experiment.tags.all())

奇怪的是,在self.experiments中设置了标记。调用post_tags()方法。

模型是:

代码语言:javascript
复制
class Experiment(models.Model):
     owner = models.ForeignKey(User, related_name='experiments') 

     name = models.CharField(max_length=32, default='')
     start_date = models.DateField()

     tags = TaggableManager()
EN

回答 2

Stack Overflow用户

发布于 2014-11-12 01:30:42

最终找到了解决方案:

代码语言:javascript
复制
@factory.post_generation
def post_tags(self, create, extracted, **kwargs):
    self.tags.add(u'abc, cde', u'xzy')
票数 2
EN

Stack Overflow用户

发布于 2017-04-06 19:25:57

对于任何想要使用Factory Boy和django-taggit的更通用示例的人来说,Factory Boy文档中的include a Many-to-Many example非常有用。所以:

代码语言:javascript
复制
import factory

from myapp.models import Experiment


class ExperimentFactory(factory.DjangoModelFactory):
    class Meta:
        model = Experiment

    # other fields here

    @factory.post_generation
    def tags(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of tags were passed in, use them.
            for tag in extracted:
                self.tags.add(tag)

然后您可以执行以下操作:

代码语言:javascript
复制
from myapp.factories import ExperimentFactory

ExperimentFactory(name='A Name', tags=['Tag 1', 'Tag 2', 'Another tag',])

请注意,只有在使用ExperimentFactory.create()或其同义词ExperimentFactory()时,如果使用ExperimentFactory.build(),则不会创建标记。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26866367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档