2016-07-07 80 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)