工厂男孩提取原味kwargs

2024-03-28 12:18:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用生成django模型的factory_boy构建一个工厂。我想看看用户输入的参数是什么。我的工厂看起来像这样

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类中编写我自己的__init__函数
    • 这会被神秘地覆盖,在我调用s = SomeFactory()时,也不会在调用s.__init__()时调用
  • 覆盖__new__方法也是如此
  • 重写命名错误的_adjust_kwargs
    • 这给我的所有字段都是kwargs,而不仅仅是用户定义的字段。例如,调用s = SomeFactory(name='Matt'),我会得到一个kwargsdict,其中包含namesome_other_thing的键,这就不可能告诉输入它们自己的参数与否
  • 覆盖_create
    • 重写_adjust_kwargs时仍然会遇到同样的问题,因为kwargs不包含原始的{},而是包含所有参数

我想我所追求的很多功能都是在factory_boyStepBuilder(我怀疑它是在instantiate方法中)的黑框中的,但是我不知道如何修改它来实现我想要的功能。在

有没有人想知道在调用s = SomeFactory()时,最初设置了哪个kwargs?一、 确定如果我说s = SomeFactory(name='Matt'),用户是否手动设置了名称?在

谢谢!在

更新:我正在运行django版本1.11.2factory_boy版本{},和{}版本{}


Tags: django用户name版本参数factory工厂some
1条回答
网友
1楼 · 发布于 2024-03-28 12:18:49

您可以重写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)

当我这么说的时候:

^{pr2}$

如果您想为create以外的其他构建策略捕获kwargs,那么还需要为stub和{}方法执行此操作。在

相关问题 更多 >