2017-09-07 13 views
1

Factory 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

関連する問題