2017-06-14 52 views
3

我正在建造一个生产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字典与键namesome_other_thing,这使得它不可能知道自己输入参数或不
  • 改写_create
    • 仍然遇到同样的问题覆盖_adjust_kwargs,在kwargs不包含原始kwargs,而是所有的参数都

我认为很多我以后的功能是在factory_boyStepBuilder(我怀疑它在instantiate方法中)的黑盒子里,但我不知道如何修改它以做我想做的。

有没有人有任何想法如何找出哪个kwargs最初设置在s = SomeFactory()的电话?即确定如果我说s = SomeFactory(name='Matt'),那用户手动设置名字?

谢谢!

更新:我运行django1.11.22.8.1factory_boy版本,python版本3.5.2

回答

1

可以重写create方法只获取用户kwargs。

一个完整的例子是这样的:

from django.contrib.auth.models import User 
import factory 


class UserFactory(factory.DjangoModelFactory): 
    username = factory.Sequence(
     lambda n: 'test' 
    ) 
    email = factory.Sequence(lambda n: 'user{0}@example.com'.format(n)) 

    class Meta: 
     model = User 

    @classmethod 
    def create(cls, **kwargs): 

     # here you'll only have the kwargs that were entered manually 

     print(str(kwargs)) 

     return super(UserFactory, cls).create(**kwargs) 

所以,当我把它称为:

In [2]: UserFactory(username='foobar') 
{'username': 'foobar'} 
Out[2]: <User: foobar> 

如果你想赶上其他构建策略kwargs比create,您还需要为stubbuild方法做这个。

+0

嘿@dan_kaufhold,不幸的是使用'_prepare'方法不能解决我的问题。当我创建一个新工厂时触发该方法,但是'kwargs'的值不等于传入的原始参数。它包含所有参数 - 例如,在您的示例中,调用'UserFactory(password ='apple ')'会给我一个包含'{“email”:“[email protected]”,“password”:“test123”}'的'kwargs'。我试图确定一个必填字段是由用户手动输入的,还是由工厂生成的。在你的例子中,我无法检测到'email'是用户还是机器。 – mjkaufer

+0

@mjkaufer仔细观察。如果'kwargs'中没有其他密码,密码只能设置为'test123'。当你真正检查了第一个代码示例中'kwargs'的位置时,你会发现它确实是你输入的'kwargs'。在UserFactory示例中,我就是这么做的。我检查密码是否在'kwargs'中给出并操作。 –

+0

但在我的代码中,我想查看是否覆盖现有字段。在你的例子中,如果密码是UserFactory中的一个字段,你将无法区分是否手动输入了密码“kwarg”,或者计算机是否根据“_prepare”方法生成密码。 – mjkaufer