2013-10-02 53 views
8

私はfactory_boyを使用してテストフィクスチャを作成しています。私は、SQLAlchemyモデル(以下で簡略化)に裏打ちされた2つのシンプルな工場を持っています。factory_boyファクトリで重複を避ける

AddressFactory.create()に複数回お電話できたら、Countryがまだ存在しない場合は作成してください。それ以外の場合は、既存のレコードを再利用します。

class CountryFactory(factory.Factory): 
    FACTORY_FOR = Country 

    cc = "US" 
    name = "United States" 


class AddressFactory(factory.Factory): 
    FACTORY_FOR = Address 

    name = "Joe User" 
    city = "Seven Mile Beach" 
    country = factory.SubFactory(CountryFactory, cc="KY", name="Cayman Islands") 

私の質問は:factory_boyは新しい国にそれがアドレスを作成するたびに作成しようとしないように、私はこれらの工場を設定することができますか?最新の工場出荷時の少年で

+0

あなたは[factory.alchemy](https://github.com/rbarrois/factory_boy/blob/master/factoryを見てみませんでした/alchemy.py)? – javex

+0

あなたはそのリンクで何を参照しているのか分かりません。その特定のファイルには役立たないものは何もありません。私は特にfactory_boyとSQLAlchemyファクトリのドキュメントを見てきましたが、レコードの再利用については何も見ていません。基本的には、「検索または作成」タイプの機能を探しています。 –

+0

これについてさらに研究した後、短い答えはあなたがそれをすることができないということです。 [Djangoモデルでの作成/作成](https://factoryboy.readthedocs.org/en/latest/orms.html#factory.django.DJangoModelFactory.FACTORY_DJANGO_GET_OR_CREATE)はサポートされていますが、SQLAlchemyではサポートされていません。私はこの質問を開いたままにしています。なぜなら、誰も私に打ちのめされなければ、この1つのSQLAlchemyサポートを追加することを望んでいるからです。 –

答えて

4

==を使用すると、CCフィールドには一意の識別子であると仮定すると、FACTORY_DJANGO_GET_OR_CREATE

class CountryFactory(factory.django.DjangoModelFactory): 
    FACTORY_FOR = 'appname.Country' 
    FACTORY_DJANGO_GET_OR_CREATE = ('cc',) 

    cc = "US" 
    name = "United States" 

を追加することができます2.3.1。あなたはSQLAlchemyのベースの工場のためのget_or_create機能がないことを右ているときには、外部キーとして使用するオブジェクトがすでに存在する場合

+0

上記の私の質問とフォローアップのコメントで述べたように、私はSQLAlchemyを使用しています。私はこれがDjangoのために存在することを知っていますが、それは私を助けません。私が探している機能は工場の少年には存在しません。私はまだそれを自分で追加する時間がありませんでした。 –

2

、あなたはそれらを反復処理することができますので、

http://factoryboy.readthedocs.org/en/latest/recipes.html#choosing-from-a-populated-table

おそらく、オブジェクトがdbに存在するかどうか最初にチェックする遅延属性を使用して、そのメソッドを繰り返し処理することができますが、オブジェクトが存在しない場合は、 SubFactoryを使用してオブジェクトを最初に作成します。

+0

これは間違いなく、あなたがPRにSQLAlchemyのget_or_create機能を追加して提出した場合、はるかに良い解決策です。 –

0

もう1つの解決策は、結果を照会してキャッシュすることによってオブジェクトを検索する方法でファクトリのメソッドを上書きすることです。

この単純な例**kwargsにはフィルタリングはいえない:

class StaticFactory(SQLAlchemyModelFactory):       

    counter = 0              
    cache = []              
    model = None              

    @classmethod              
    def create(cls, **kwargs):          
     if not cls.cache:           
      cls.cache = your_session.query(cls.model).all()  
     instance = cls.cache[cls.counter]       
     cls.counter = (cls.counter + 1) % len(cls.cache)    
     return instance            
関連する問題