2016-07-07 1 views
1

Je partage ma solution à mon propre problème auquel j'ai réalisé la solution tout en tapant la question ... il peut être utile à d'autres.Facteur garçon même instance de propriété de modèle sur le parent et l'usine liée

Dans mes modèles Django j'ai un Gateway qui a un ensemble de Node s avec et ils devraient tous les deux avoir le même 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') 

Maintenant, je voudrais générer des données fausses avec factory boy. Voici les VendorFactory et NodeFactory.

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) 

Cela fonctionne très bien lors de la création du node = NodeFactory().

Le problème est avec le GatewayFactory. Qu'est-ce que je voudrais, c'est gateway = GatewayFactory() crée un Gateway qui est référencé par une instance Node et la passerelle et le nœud utilisant le même Vendor.

A essayé quelques choses mais échoué. Voici un coup:

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) 

Le problème est que la RelatedFactory est évaluée après la GatewayFactory et un LazyAttribute ou SelfAttribute sont évalués dans le cadre du NodeFactory.

Répondre

0

La solution est dans le fait que « la RelatedFactory est évaluée après la GatewayFactory et un LazyAttribute ou SelfAttribute sont évalués dans le cadre de le NodeFactory »

Ainsi, nous pouvons faire référence à la parent pour obtenir l'attribut du vendeur:

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

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

Cela fonctionne pour le LazyAttribute ainsi:

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)