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')
dict,其中包含kwargs
和name
的键,这样就无法判断输入的参数是否正确someother\u thing
- 这将为我提供所有字段作为
- 覆盖
\u创建
- 覆盖
仍会遇到相同的问题,因为\u adjust\u kwargs
不包含原始kwargs
,而是包含所有参数kwargs
- 覆盖
factory\u boy
的StepBuilder
(我怀疑它是在实例化
方法中)的黑盒中,但我不知道如何修改它来实现我想要的功能
有没有人想过如何找出调用s=SomeFactory()
时最初设置了哪些kwargs
?即,确定如果我说s=SomeFactory(name='Matt')
,用户是否手动设置名称
谢谢
更新:我正在运行
django
version1.11.2
,factory\u boy
version2.8.1
,以及python
version3.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。很好,这非常有效。谢谢你的帮助!