У меня есть несколько заводов с такой структурой:
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
В моделях у меня
AbstractModel(TimeStampedModel)
а также
SomeModel(AbstractModel)
Я даже смотрю на mro, и он выглядит именно так, как я ожидал:
(FactoryFull,
FactoryMinimal,
AbstractFactoryFull,
AbstractFactoryMinimal,
factory.django.DjangoModelFactory,
factory.base.Factory,
factory.base.BaseFactory,
object)
Таким образом, поле «комментарий» должно быть сгенерировано мошенником, а не просто установлено с помощью «». Почему так работает? Как я могу реализовать фабрики, чтобы увидеть ожидаемое поведение?
РЕДАКТИРОВАТЬ: я могу изменить порядок наследования на последней фабрике на это:
FactoryFull(AbstractFactoryFull, FactoryMinimal)
это будет работать, но тогда, если я захочу переопределить поле в FactoryMinimal, это не сработает. И иногда мне нужна именно эта функция. И вообще, это не нормальное поведение наследования в Python.