如何使用 factory_boy 在 django 中为此模型编写工厂?
How to write a factory for this model in django using factory_boy?
我的应用程序中有一个模型,该模型包含 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)
这是 places
应用程序中的 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
的过滤器?
有人可以帮我解决这个问题吗??
提前致谢。
您还应该创建 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的官方文档。
我的应用程序中有一个模型,该模型包含 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)
这是 places
应用程序中的 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
的过滤器?
有人可以帮我解决这个问题吗?? 提前致谢。
您还应该创建 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的官方文档。