Python 工厂男孩提取原kwargs

Python 工厂男孩提取原kwargs,python,django,factory-boy,Python,Django,Factory Boy,我正在用factory\u boy构建一个工厂,它生成一个django模型。我想看看用户输入的内联参数。我的工厂本身就是这样 class SomeFactory(factory.django.DjangoModelFactory): name = factory.Sequence(lambda n: 'Instance #{}'.format(n)) some_other_thing = factory.SubFactory(SomeOtherFactory) cla

我正在用
factory\u boy
构建一个工厂,它生成一个django模型。我想看看用户输入的内联参数。我的工厂本身就是这样

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')

到目前为止我试过的是

  • SomeFactory
    类中编写我自己的
    \uuuuuu init\uuuuu
    函数
    • 这会被神秘地覆盖,当我调用
      s=SomeFactory()
      时,或者当我调用
      s时,都不会调用它
  • 覆盖
    \uuuu new\uuuu
    方法也是如此
  • 覆盖名称不正确的
    \u adjust\u kwargs
    • 这将为我提供所有字段作为
      kwargs
      ,而不仅仅是用户定义的字段。例如,调用
      s=SomeFactory(name='Matt')
      ,我会得到一个
      kwargs
      dict,其中包含
      name
      someother\u thing
      的键,这样就无法判断输入的参数是否正确
  • 覆盖
    \u创建
    
    
    • 覆盖
      \u adjust\u kwargs
      仍会遇到相同的问题,因为
      kwargs
      不包含原始
      kwargs
      ,而是包含所有参数
我认为我所追求的很多功能都是在
factory\u boy
StepBuilder
(我怀疑它是在
实例化
方法中)的黑盒中,但我不知道如何修改它来实现我想要的功能

有没有人想过如何找出调用
s=SomeFactory()
时最初设置了哪些
kwargs
?即,确定如果我说
s=SomeFactory(name='Matt')
,用户是否手动设置名称

谢谢


更新:我正在运行
django
version
1.11.2
factory\u boy
version
2.8.1
,以及
python
version
3.5.2

,您可以覆盖
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>
[2]中的
:UserFactory(username='foobar')
{'username':'foobar'}
出[2]:

如果您想为
create
以外的其他构建策略捕获Kwarg,您还需要为
stub
build
方法执行此操作。

Hey@dan_kaufhold,不幸的是,使用
\u prepare
方法无法解决我的问题。创建新工厂时会触发该方法,但
kwargs
的值不等于传入的原始参数。它包含所有参数-例如,在您的示例中,调用
UserFactory(password='apple')
会给我一个
kwargs
{“email”:user0@example.com“,”密码“:“test123”}
。我试图确定一个必填字段是由用户手动输入的,还是通过factory boy生成的。在您的示例中,我无法检测电子邮件是用户还是机器制造的。@mjkaufer仔细看看。只有在
kwargs
中没有其他密码时,密码才会设置为
test123
。当您实际检查我评论的第一个代码示例中的
kwargs
是什么时,您将看到它正是您输入的
kwargs
。在UserFactory示例中,我就是这样做的。我检查密码是否在
kwargs
中给出,并对其进行操作。但在我的代码中,我想查看是否覆盖了现有字段。在您的示例中,如果密码是UserFactory中的一个字段,您将无法区分密码
kwarg
是手动输入的,还是计算机根据
\u prepare
方法生成的。@mjkaufer我明白您的意思。更新了我的答案。
\u\u调用\u
方法只包括您输入的KWARG,而不包括由字段声明的KWARG。很好,这非常有效。谢谢你的帮助!