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.