Cof*_*orm 4 django factory-boy
ATTR__SUBATTR我认为您应该能够直接传递已经存在的实例,而不是以 的形式将数据传递到工厂的RelatedFactory 。除非我错过了一些非常明显的东西,否则这似乎不起作用。看一看:
class Owner(models.Model):
name = models.CharField()
class Item(models.Model):
name = models.CharField()
owner = models.ForeignKey(Owner, null = True, related_name = 'items')
class ItemFactory(factory.django.DjangoModelFactory):
class Meta:
model = Item
class OwnerFactory(factory.django.DjangoModelFactory):
class Meta:
model = Owner
items = factory.RelatedFactory(ItemFactory, 'owner')
item = Item.objects.create(name='Foo')
alice = OwnerFactory(name='Alice', items__name='Bar')
alice.items.all()
<QuerySet [<Item: Bar>]>
bob = OwnerFactory(name='Bob', items=item) # or items = [item] doesn't matter
bob.items.all()
<QuerySet []>
Run Code Online (Sandbox Code Playgroud)
一直致力于让我的工厂变得漂亮、干燥,但遇到了这个障碍。我自己编写了一个RelatedFactory允许同时处理多个值的改编版本,如果您在过程中创建新对象,则效果很好 - 但如果您使用已经存在的对象,则效果不佳。
有效的示例:OwnerFactory(items__name=['Foo','Bar'])=> Foo and Bar in owner.items.
不起作用的示例:OwnerFactory(items=[foo,bar])=> owner.items is empty
请注意,我在顶部的大示例中使用了默认的RelatedFactory。
我一整天都在研究factory_boy的文档,但找不到解决方案,现在狭隘视野已经占据了主导地位,禁止任何新的见解。
您正在寻找http://factoryboy.readthedocs.io/en/latest/recipes.html#simple-many-to-many-relationship
class ItemFactory(factory.django.DjangoModelFactory):
class Meta:
model = Item
class OwnerFactory(factory.django.DjangoModelFactory):
class Meta:
model = Owner
@factory.post_generation
def items(self, create, extracted, **kwargs):
if not create:
# Simple build, do nothing.
return
if extracted:
# A list of items were passed in, use them
for item in extracted:
self.items.add(item)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1498 次 |
| 最近记录: |