我正在建立一个factory_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')
我到目前为止所做的是
__init__
课程中编写自己的SomeFactory
函数
s = SomeFactory()
时,我都没有打电话,也没有打电话给s.__init__()
__new__
方法_adjust_kwargs
kwargs
,而不仅仅是用户定义的字段。例如,调用s = SomeFactory(name='Matt')
,我会得到一个kwargs
dict,其中包含name
和some_other_thing
的键,这样就无法告诉输入他们自己的参数_create
_adjust_kwargs
时仍会遇到同样的问题,因为kwargs
并不包含原始kwargs
,而是包含所有参数我认为我之后的许多功能都是factory_boy
StepBuilder
内的黑盒子(我怀疑它在{{1}中方法)但我不知道如何修改它来做我想做的事。
有没有人想过如何找出instantiate
来电中最初设置的kwargs
?即确定如果我说s = SomeFactory()
,用户手动设置名称?
谢谢!
更新:我正在运行s = SomeFactory(name='Matt')
版本django
,1.11.2
版本factory_boy
和2.8.1
版本python
答案 0 :(得分: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>
如果您希望捕获kwargs以获取除create
之外的其他构建策略,则还需要对stub
和build
方法执行此操作。