2017-09-07 3 views
1

Ich möchte Factory Boy und its support für Faker verwenden, um Zeichenfolgen von mehr als einem Anbieter zu generieren. z.B. Kombinieren prefix und name:In Factory Boy, wie man mit Faker erzeugte Saiten verbindet?

# models.py 
from django.db import models 

class Person(models.Model): 
    full_name = models.CharField(max_length=255, blank=False, null=False) 


# factories.py 
import factory 

class PersonFactory(factory.Factory): 
    class Meta: 
     model = models.Person 

    full_name = '{} {}'.format(factory.Faker('prefix'), factory.Faker('name')) 

Aber das scheint nicht zu funktionieren. Beispiel:

>>> person = PersonFactory() 
>>> person.full_name 
'<factory.faker.Faker object at 0x7f25f4b09e10> <factory.faker.Faker object at 0x7f25f4ab74d0>' 

Was fehlt mir?

+0

Was sind die Felder in Ihrer 'models.Person' Klasse? Dies ist eine relevante Information. – wim

+0

OK, ich war mir nicht sicher, ob es helfen würde, aber ich habe es jetzt hinzugefügt. –

+0

@PhilGyford: Funktioniert [this] (https://factoryboy.readthedocs.io/en/latest/index.html#lazy-attributes)? Sie müssten ein 'Präfix'- und ein' Name'-Klassenattribut erstellen, die in Ihrem Modell nicht vorhanden sind, und sie dann kombinieren, um 'full_name' zu ​​erstellen. Ich bin mir nicht sicher, ob dies zu einem Fehler führen wird, da das ursprüngliche 'Personenmodell 'diese Felder nicht enthält. – Blender

Antwort

2

können Sie verwenden, um das (im Wesentlichen ohne Papiere) exclude Attribut Ihren ersten Ansatz funktioniert:

class PersonFactory(factory.Factory): 
    class Meta: 
     model = Person 
     exclude = ('prefix', 'name') 

    # Excluded 
    prefix = factory.Faker('prefix') 
    name = factory.Faker('name') 

    # Shows up 
    full_name = factory.LazyAttribute(lambda p: '{} {}'.format(p.prefix, p.name)) 

Sie auch factory.LazyAttribute nur nutzen konnten und es alles in einem Rutsch erzeugen, indem sie direkt faker mit:

from faker import Faker 

fake = Faker() 

class PersonFactory(factory.Factory): 
    class Meta: 
     model = Person 

    # Shows up 
    full_name = factory.LazyAttribute(lambda p: '{} {}'.format(fake.prefix(), fake.name())) 

Der Nachteil dieses Ansatzes ist, dass Sie nicht einfach auf das Präfix oder den Namen der Person zugreifen können.

+0

Danke! Ich dachte, es gäbe vielleicht einen Weg mit 'factory.LazyAttribute', aber ich habe nie die richtige Kombination von Fälschungen gefunden. –

+0

Ziemlich gut. Die einzige Schwierigkeit besteht darin, dass Sie auf diese Weise Transgender-Namen (im wörtlichen Sinne des Wortes) erzeugen. – wim

Verwandte Themen