python - 工厂男孩工厂中错误的继承行为

标签 python django factory-boy

我有几个工厂,其结构如下:

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)

所以“评论”字段应该由 faker 生成,而不仅仅是用 '' 设置。为什么工作是这样的?我如何实现工厂来查看预期的行为?

编辑: 我可以将最后一个工厂中的继承顺序更改为:

FactoryFull(AbstractFactoryFull, FactoryMinimal)

它会起作用,但是如果我想覆盖 FactoryMinimal 中的字段,它就不起作用。有时我正是需要这个功能。无论如何,这首先不是 Python 中的正常继承行为。

最佳答案

所以我找到了一些解决方法。

基本上,我更改继承顺序并重复一些代码。像这样:

FactoryMinimal(AbstractFactoryMinimal):
    field = ''

    class Meta(object):
        model = SomeModel

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

    class Meta(object):
        model = SomeModel

如果我需要重写基类中的某些内容,我可以使用 MixIn 类:

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

只剩下一个问题:我如何能告诉任何愿意维护我的代码的人为什么我在每个工厂都这样做。

关于python - 工厂男孩工厂中错误的继承行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237869/

相关文章:

python - 拥有一个可供所有线程使用的全局队列(或列表)

python - 即使在发生错误后继续 python 脚本

python - 如何为Python虚拟环境配置Ansible?

python - Django - 使用 Django 学习网站开发 - 无法确定views.py或urls.py中是否存在语法错误

django - 上传图片时出现 UnicodeEncodeError 异常

python - Factory Boy 及相关对象创建

Django Factory Boy 创建 vs create_batch

python - 如何打印状态栏和百分比?

python - Django 工厂男孩 : fill modelfield with choices throws error

python - Django REST框架: accepting multiple POSTed objects with a list_route