2016-07-07 45 views
1

我分享我的解决方案,我自己的问题,我认识到解决方案,同时输入问题......它可能对其他人有用。因素男孩父母和相关工厂相同的模型属性实例

在我的Django模型中,我有一个Gateway,它有一组Node s,它们都应该有相同的Vendor

class Vendor(models.Model): 
    name = models.CharField(max_length=80, null=False) 

class Gateway(models.Model): 
    vendor = models.ForeignKey(Vendor, related_name='gateways') 

class Node(models.Model): 
    gateway = models.ForeignKey(Gateway, related_name='nodes') 
    vendor = models.ForeignKey(Vendor, related_name='nodes') 

现在我想用factory boy产生假数据。这里的VendorFactoryNodeFactory

class VendorFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = Vendor 

    name = 'test_vendor' 


class NodeFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = Node 

    # is created after this node instance 
    vendor = factory.SubFactory(VendorFactory) 

这在创建node = NodeFactory()时工作正常。

问题出在GatewayFactory。我想要的是,gateway = GatewayFactory()创建一个Gateway,该实例由Node实例引用,并且网关和节点使用相同的Vendor

A尝试了一些东西,但失败了。这里一个镜头:

class GatewayFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = Gateway 

    node = factory.RelatedFactory(NodeFactory, 'gateway', vendor=factory.LazyAttribute(lambda o: o.vendor)) 
    vendor = factory.SubFactory(VendorFactory) 

的问题是RelatedFactory是GatewayFactory后评估和LazyAttributeSelfAttribute在NodeFactory的背景下进行评估。

回答

0

的解决方案是这样的事实:

因此“的RelatedFactory是GatewayFactory和LazyAttribute或SelfAttribute后在的NodeFactory的上下文中评价评价”,我们可以参考家长拿到供应商属性:

class GatewayFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = Gateway 

    node = factory.RelatedFactory(NodeFactory, 'gateway', vendor=factory.SelfAttribute('gateway.vendor')) 
    vendor = factory.SubFactory(VendorFactory) 

此作品为LazyAttribute还有:

class GatewayFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = Gateway 

    node = factory.RelatedFactory(NodeFactory, 'gateway', vendor=factory.LazyAttribute(lambda o: o.gateway.vendor)) 
    vendor = factory.SubFactory(VendorFactory)