2017-09-07 9 views
1

FakerFactory Boyits support을 사용하여 둘 이상의 공급자에서 문자열을 생성하고 싶습니다. 예 :Factory Boy에서 Faker로 만든 문자열을 결합하는 방법은 무엇입니까?

# 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')) 

을하지만이 작동하지 않는 것 : prefixname을 결합. 예 :

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

무엇이 누락 되었습니까? 직접 faker를 사용하여

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)) 

또한 단지 factory.LazyAttribute을 사용할 수 있으며, 한 번에 모든 것을 생성 :

+0

'models.Person' 클래스의 필드는 무엇입니까? 관련 정보입니다. – wim

+0

OK, 도움이 될지 확신 할 수 없지만 지금 추가했습니다. –

+0

@PhilGyford : [this] (https://factoryboy.readthedocs.io/en/latest/index.html#lazy-attributes)가 작동합니까? 모델에 존재하지 않는'prefix'와'name' 클래스 속성을 생성하고 결합하여'full_name'을 생성해야합니다. 원래'Person' 모델에 해당 필드가 없으므로 이것이 오류를 유발할 지 확신 할 수 없습니다. – Blender

답변

2

당신은 당신의 첫 번째 접근 작업을 만들기 위해 (기본적으로 문서화되지 않은) exclude 속성을 사용할 수 있습니다

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())) 

이 접근 방식의 단점은 사용자의 접두사 나 이름에 쉽게 액세스 할 수 없다는 것입니다.

+0

감사! 어쩌면'factory.LazyAttribute'라는 방법이 있었지만 결코 가짜의 올바른 조합을 찾지 못했을 것이라고 생각했습니다. –

+0

아주 좋습니다. 오직 말장난은 당신이 트랜스젠더 (단어의 문자 적 ​​의미로) 이름을 이런 방식으로 생성 할 것이라는 점이다. – wim