我正在建造一个生产django模型的工厂factory_boy
。我想看看用户输入内联的参数。我厂本身看起来像这样factory_boy提取原始kwargs
class SomeFactory(factory.django.DjangoModelFactory):
name = factory.Sequence(lambda n: 'Instance #{}'.format(n))
some_other_thing = factory.SubFactory(SomeOtherFactory)
class Meta:
model = SomeModel
现在,用户可以说s = SomeFactory()
和它的工作很好,但我想如果用户输入自己的参数检测。例如,要告诉我们,如果用户以自己的名义通过,如s = SomeFactory(name='Matt')
我到目前为止已经试过是
- 写我自己
__init__
功能在SomeFactory
类- 这当我拨打
s = SomeFactory()
时,我也不会打电话,也不会拨打电话s.__init__()
- 这当我拨打
- 同样适用于覆盖
__new__
方法 - 改写命名不佳
_adjust_kwargs
- 这给了我所有领域
kwargs
,而不仅仅是用户定义的值。例如,呼叫s = SomeFactory(name='Matt')
,我会得到一个kwargs
字典与键name
和some_other_thing
,这使得它不可能知道自己输入参数或不
- 这给了我所有领域
- 改写
_create
- 仍然遇到同样的问题覆盖
_adjust_kwargs
,在kwargs
不包含原始kwargs
,而是所有的参数都
- 仍然遇到同样的问题覆盖
我认为很多我以后的功能是在factory_boy
的StepBuilder
(我怀疑它在instantiate
方法中)的黑盒子里,但我不知道如何修改它以做我想做的。
有没有人有任何想法如何找出哪个kwargs
最初设置在s = SomeFactory()
的电话?即确定如果我说s = SomeFactory(name='Matt')
,那用户手动设置名字?
谢谢!
更新:我运行django
版1.11.2
,2.8.1
factory_boy
版本,python
版本3.5.2
嘿@dan_kaufhold,不幸的是使用'_prepare'方法不能解决我的问题。当我创建一个新工厂时触发该方法,但是'kwargs'的值不等于传入的原始参数。它包含所有参数 - 例如,在您的示例中,调用'UserFactory(password ='apple ')'会给我一个包含'{“email”:“[email protected]”,“password”:“test123”}'的'kwargs'。我试图确定一个必填字段是由用户手动输入的,还是由工厂生成的。在你的例子中,我无法检测到'email'是用户还是机器。 – mjkaufer
@mjkaufer仔细观察。如果'kwargs'中没有其他密码,密码只能设置为'test123'。当你真正检查了第一个代码示例中'kwargs'的位置时,你会发现它确实是你输入的'kwargs'。在UserFactory示例中,我就是这么做的。我检查密码是否在'kwargs'中给出并操作。 –
但在我的代码中,我想查看是否覆盖现有字段。在你的例子中,如果密码是UserFactory中的一个字段,你将无法区分是否手动输入了密码“kwarg”,或者计算机是否根据“_prepare”方法生成密码。 – mjkaufer