【问题标题】:How to write a factory for this model in django using factory_boy?如何使用 factory_boy 在 django 中为此模型编写工厂?
【发布时间】:2018-04-17 16:10:58
【问题描述】:

我的应用中有一个模型,该模型包含同一模型上的 many_to_many 字段,但带有过滤器。更清楚地说,这就是我所拥有的:

class Places(models.Model):
     user = models.OneToOneField('User')
     common_kwargs = dict(to='places.Place', blank=True)
     place1_kwargs = dict(
     common_kwargs.items() + {
        'limit_choices_to': {'site__token': 'site1'},
        'related_name': '%(app_label)s_%(class)s_place1',
        'verbose_name': _('Place 1')
        }.items()
    )
    place1= models.ManyToManyField(**place1_kwargs )

       place2_kwargs = dict(
       common_kwargs.items() + {
        'limit_choices_to': {'site__token': 'site2'},
        'related_name': '%(app_label)s_%(class)s_place2',
        'verbose_name': _('Place 2')
        }.items()
    )
    place2 = models.ManyToManyField(**place2_kwargs)

这是Place 应用程序中的Place 模型:

class Place(models.Model):
     site= models.ForeignKey(Site, verbose_name=_('Site'))
     name = models.CharField(verbose_name=_('Name'),unique=True, max_length=255, db_index=True)
     city = models.CharField(max_length=255, verbose_name=_('City'), null=True)

这是站点模型:

 class Site(models.Model):
     token = models.CharField(_('Token'), max_length=255, unique=True, editable=False)
     name = models.CharField(_('Name'), max_length=255)

我尝试为Places 模型创建工厂,但我不知道如何设置Site 的过滤器?

有人可以帮我吗? 提前致谢。

【问题讨论】:

    标签: django django-models django-tests factory-boy


    【解决方案1】:

    您还应该创建 SiteFactory 并使用 SubFactory,因为它是 ForeignKey。希望这会有所帮助:

    class PlacesFactory(DjangoModelFactory):
        class Meta:
            model = Places
    
            site = factory.SubFactory(SiteFactory)
    
        @factory.post_generation
        def place1(self, create, extracted):
            if not create:
                return
            if extracted:
                for place in extracted:
                    self.place1.add(place)
    

    这里可以找到SubFactory的官方文档。

    【讨论】:

    • 感谢您的回答,但是如何创建Places 模型的place1place2 的两个m2m 字段?
    • @pietà 我更新了答案 :) 你应该使用 factory.post_generation 装饰器。
    • @pietà 为每个 M2M 字段创建一个方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多