2016-10-05 2 views
0

Ich habe ein Projekt mit Clients, Entwurfsschedules, LineItems und Servern.Django Factory Boy über verwandte Eltern iterieren

  • Jeder Kunde einen einzigen DraftSchedule hat, hat jeder Draftschedule viele Lineitems

  • Jeder Kunde hat viele Server

  • Jeder LineItem hat einen Single Server

enter image description here

I Haben Sie einen Code, um LineItems für jeden DraftSchedule mit zufälligen Daten zu generieren. Jedoch ist die resultierenden Lineitem enthalten Server nicht tatsächlich von dem Draftschedule Besitz Kunden

class LineItemFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = LineItem 

    line_item_type = factory.Iterator(LineItemType.objects.all()) 
    draftschedule = factory.Iterator(DraftSchedule.objects.all()) 

    servers = factory.Iterator(Server.objects.all()) # <----- Problem line 

    cost = factory.LazyAttribute(lambda x: faker.pydecimal(2, 2, positive=True)) 
    detail = factory.LazyAttribute(lambda x: faker.sentence()) 
    ... 

Ich mag würde die Server Wahl beschränken setzt nur der Server von dem Parent-Client des Draftschedule im Besitz sein die LineItem für erstellt werden.

So dass, wenn ich LineItemFactory() Aufruf gibt es ein neues LineItem Objekt und ich kann der Server auf dem LineItem garantee, dass tatsächlich durch die mit dem DraftSchedule

zugehörigen Client gehört

ich folgendes versucht haben:

servers = factory.Iterator(lambda x: x.draftschedule.client.servers.all()) 

wo client.servers ist der zugehörige Name, aber die Funktion Iterable ist nicht so bin ich ein bisschen

stecken

ist das möglich oder soll ich das Problem aus einem anderen Blickwinkel nähern?

Antwort

1

könnten Sie versuchen, eine lazy_attribute_sequence mit:

@factory.lazy_attribute_sequence 
def servers(obj, seq): 
    all_servers = obj.draftschedule.client.servers.all() 
    nb_servers = all_servers.count() 
    return all_servers[seq % nb_servers]