12

ORM として SQLalchemy を使用しており、テスト フィクスチャを factory_boy に移植しようとしています。私のスキーマには、1 対多の関係にある 2 つのオブジェクトが含まれています。つまり、あるモデルのインスタンスは、他のインスタンスを持つリストのような構造を持っています。例:

class Person(...):
  id = Column(Integer, primary_key=True)
  name = Column(Text)
  [...]

class Address(...):
  id = Column(Integer, primary_key=True)
  city = Column(Text)
  [...]
  person_id = Column(Integer, ForeignKey('person.id'))
  person = relationship("Person", backref="addresses")

現在、いくつかの住所を持つ人を作成する工場を作成しようとしています。Factory_boy にはSubFactory. しかし、それを 1 対 1 の関係で使用する方法しかわかりません。person =別のファクトリでアドレスを作成してアタッチできることはわかっていますが、 PersonFactory.create(num_addresses=4)`のようなことをしたいと思います。

これが現在 factory_boy で可能かどうか知っている人はいますか?

factory_boy 2.4.1 を使用しています。

4

5 に答える 5

0

私はこの正確な質問を持っていて、ここに良い答えがないことに失望しました. それが可能であることがわかりました!同じ質問がある人のために、これをここに残します。

まず、モデルは ForeignKey とは反対のモデルでリレーションシップを定義する必要があるため、次のようになります。


class Person(...):
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    addresses = relationship("Person", backref="person")
    [...]

class Address(...): id = Column(Integer, primary_key=True) city = Column(Text) [...] person_id = Column(Integer, ForeignKey('person.id'))

次に、PersonFactory で、次のような post_generation フックを追加できます。


class PersonFactory(BaseFactory):
    [...attributes...]

    @factory.post_generation
    def addresses(self, create, extracted, **kwargs):
        return AddressFactory.create_batch(4)

「4」を任意の数字に置き換えます。もちろん、AddressFactory も定義する必要があります。

于 2016-06-17T01:59:42.070 に答える
-2

ここで説明されているソリューションを使用できます: http://factoryboy.readthedocs.org/en/latest/recipes.html#reverse-dependencies-reverse-foreignkey

基本的に、RelatedFactoryあなたのでいくつか宣言するだけPersonFactoryです:

class PersonFactory(factory.alchemy.SQLAlchemyFactory):
    class Meta:
        model = Person

    address_1 = factory.RelatedFactory(AddressFactory, 'person')
    address_2 = factory.RelatedFactory(AddressFactory, 'person')
于 2014-11-25T09:34:37.600 に答える