2017-06-14 7 views
3

私はfactory_boyで工場を建設しています。これは、djangoモデルを生成します。私はユーザーがインラインでどのような引数を入力したかを見たいと思います。私の工場自体は今、ユーザーがs = SomeFactory()を言うことができるし、それがうまく動作しますが、私は、ユーザー入力ならば、自分の引数を検出したいこのfactory_boyオリジナルのkwargsを抽出

class SomeFactory(factory.django.DjangoModelFactory): 

    name = factory.Sequence(lambda n: 'Instance #{}'.format(n)) 
    some_other_thing = factory.SubFactory(SomeOtherFactory) 

    class Meta: 
     model = SomeModel 

のように見えます。ユーザーは、私がこれまで試したどのようなs = SomeFactory(name='Matt')

のように、自分の名前で渡された場合SomeFactoryクラス

  • これをして自分の__init__機能を書く

    • 例えば、ある伝えるために私がと呼ぶときに不思議に上書きされて呼び出されません。s.__init__()
  • 同じようになります__new__方法
  • を上書きすることは上書き悪いこれは私のkwargsなど、すべてのフィールドは、ユーザーが定義されていないものだけを与える_adjust_kwargs
    • 命名します。例えば、s = SomeFactory(name='Matt')を呼び出して、私はそれは不可能それでも同じ問題が発生した_create
      • を上書き入力が自分の引数を教えてくれたりしませ
    • することができた、namesome_other_thingためのキーでkwargsのdictになるだろうそのkwargsで、_adjust_kwargsを上書きすると、元のkwargsではなく、すべての引数の含まれていません

私が後だ多くの機能がfactory_boyStepBuilderの内側にブラックボックスだと思う(私はそれがinstantiate方法でだ疑いがある)が、私は私がやりたいことを修正する方法が分かりません。

s = SomeFactory()への呼び出しで、最初にkwargsが設定されていることを知る方法について考えている人はいますか?私。私がs = SomeFactory(name='Matt')と言ったら、ユーザーが手動で名前を設定していると判断しますか?

ありがとうございます!

アップデート:私はあなたが唯一のユーザーkwargsからを取得するためにcreateメソッドをオーバーライドすることができdjangoバージョン1.11.2factory_boyバージョン2.8.1を実行している、とpythonバージョン3.5.2

答えて

1

よ。私はそれを呼び出すときに

from django.contrib.auth.models import User 
import factory 


class UserFactory(factory.DjangoModelFactory): 
    username = factory.Sequence(
     lambda n: 'test' 
    ) 
    email = factory.Sequence(lambda n: 'user{0}@example.com'.format(n)) 

    class Meta: 
     model = User 

    @classmethod 
    def create(cls, **kwargs): 

     # here you'll only have the kwargs that were entered manually 

     print(str(kwargs)) 

     return super(UserFactory, cls).create(**kwargs) 

完全な例は、このようなものになるだろう

In [2]: UserFactory(username='foobar') 
{'username': 'foobar'} 
Out[2]: <User: foobar> 

あなたがcreate以外のビルド戦略のkwargsからをキャッチしたい場合は、あなたも必要になりますstubおよびbuildメソッドでこれを行う。

+0

ちょっと@dan_kaufhold、残念ながら '_prepare'メソッドを使用しても私の問題は解決しません。このメソッドは新しいファクトリを作成するときにトリガされますが、 'kwargs'の値は渡された元の引数と同じではありません。すべての引数が含まれています - 例えば、' UserFactory(password = 'apple ') 'は' {"email": "[email protected]"、 "password": "test123"} 'の' kwargs'を与えます。私は、必要なフィールドがユーザによって手動で入力されたのか、工場の少年によって生成されたのかを判断しようとしています。あなたの例では、 'email'がユーザかマシンかを検出できません。 – mjkaufer

+0

@mjkauferもっと詳しく見てください。 'kwargs'に他のパスワードがない場合、パスワードは' test123'にのみ設定されます。私がコメントした最初のコード例で 'kwargs 'が何であるかを実際に確認すると、それはあなたが入れた正確な' kwargs'であることがわかります.UserFactoryの例では、私はそれを正確に行います。私はパスワードが 'kwargs'で与えられているかどうかを確認し、それを操作します。 –

+0

私のコードでは、既存のフィールドがオーバーライドされているかどうかを確認したいと思います。あなたの例では、パスワードがUserFactoryのフィールドであった場合、パスワード 'kwarg'が手動で入力されたかどうかを区別することができないか、コンピュータが' _prepare'メソッドに基づいてそれを生成したかどうかを区別できません。 – mjkaufer