2017-07-21 12 views
1

私はこのような構造を持ついくつかの工場を持っています。モデルで間違っ継承動作

AbstractFactoryMinimal(DjangoModelFactory): 
    comment = '' 

AbstractFactoryFull(AbstractFactoryMinimal): 
    comment = Faker(provider='text', max_nb_chars=2000) 

FactoryMinimal(AbstractFactoryMinimal): 
    field = '' 

    class Meta(object): 
     model = SomeModel 

FactoryFull(FactoryMinimal, AbstractFactoryFull): 
    field = Faker(provider='text', max_nb_chars=2000) 

obj = FactoryFull() 
print(obj.comment) # expect some text from faker, but got '' instead 
print(obj.field) # works like expected, return some random text 

は、私は、私もMRO見

AbstractModel(TimeStampedModel) 

SomeModel(AbstractModel) 

を持っています正確に私がそれが見えると思ったように見えます:

(FactoryFull, 
FactoryMinimal, 
AbstractFactoryFull, 
AbstractFactoryMinimal, 
factory.django.DjangoModelFactory, 
factory.base.Factory, 
factory.base.BaseFactory, 
object) 

「コメント」フィールドは、fakerによって生成され、 ''で設定されるのではありません。なぜそれがこのように仕事ですか?期待される行動を見るために工場をどのように実装できますか?

EDIT: 私はこれに最後の工場で継承の順序を変更することができます。

FactoryFull(AbstractFactoryFull, FactoryMinimal) 

それは動作しますが、私はFactoryMinimalのフィールドを上書きしたい場合は、その後、それは動作しません。そして時々私はこの機能を正確に必要とします。そして、とにかく、これはPythonの最初の継承動作ではありません。

答えて

0

私はいくつかの回避策を見つけました。

基本的に、私は継承の順序を変更し、いくつかのコードを繰り返します。

FactoryMinimal(AbstractFactoryMinimal): 
    field = '' 

    class Meta(object): 
     model = SomeModel 

FactoryFull(AbstractFactoryFull, FactoryMinimal): 
    field = Faker(provider='text', max_nb_chars=2000) 

    class Meta(object): 
     model = SomeModel 

そして、私は基本クラスから何かをオーバーライドする必要がある場合、私は、このためにミックスインクラスを使用します:

CommentFieldMixIn(DjangoModelFactory): 
    comment = 'Something Completely Different' 

FactoryMinimal(AbstractFactoryMinimal): 
    field = '' 

    class Meta(object): 
     model = SomeModel 

FactoryFull(CommentFieldMixIn, AbstractFactoryFull, FactoryMinimal): 
    field = Faker(provider='text', max_nb_chars=2000) 

    class Meta(object): 
     model = SomeModel 

つだけ問題が残っている:私はなぜ私のコードを維持するであろう誰にも言うことができますどのようにこのような私はすべての工場でこれを行う。

0
# Scan the inheritance chain, starting from the furthest point, 
# excluding the current class, to retrieve all declarations. 
for parent in reversed(self.factory.__mro__[1:]): 
    ... 

上記の理由がわかります。また、このコミットでテストを確認してくださいhttps://github.com/FactoryBoy/factory_boy/commit/e2ef7c96ed74b35b9dec75a7f222b6ffa9214c10 私は疑問に思っています。モチベーションについて、この図書館の著者に尋ねることがありますか?

+0

これは知ってもいいけど、どうやって自分が望む行動を達成できるのでしょうか? –

+0

ライブラリを変更せずにMROに依存することはできないので、そのような方法で多重継承を使用しないでください(そして、mixinを除くすべてのmb)。それが私の唯一の提案です。 –

関連する問題