2

我有一个 django 模型,它在保存时会触发在外部服务上创建帐户(与 django 没有任何关系)。不过,为了测试,我想禁止创建此帐户。我可以覆盖管理器的 save() 方法并从那里弹出 kwarg,或者我可以根据 Django 模型中的非数据库字段向模型添加一个非数据库字段属性,并在我的保存方法中检查它。

但是,当我尝试使用 factoryboy 创建对象时,它似乎会检查模型中的真实字段,由于属性不是字段而导致崩溃。

class MyModel(models.Model):
    name = models.CharField()
    create_external_account = True
    def save(self, *args, **kwargs):
        if create_external_account:
            ...

class MyModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = MyModel
    name = factory.Sequence(lambda n: 'name%d' % n)
    create_external_account = False

关于如何通过 factoryboy 传递诸如此类的额外参数的任何想法?

4

3 回答 3

1

factory_boy'create()调用模型的MyModel.objects.create(**kwargs)方法。

当您编写时MyModelFactory(),这会调用:

obj = MyModel(name="name01", create_external_account=False)
obj.save()
return obj

在这里,您应该覆盖模型的__init__方法来处理您的自定义字段:

class MyModel(django.db.models.Model):
    def __init__(self, *args, **kwargs):
        self.create_external_account = kwargs.pop('create_external_account', False)
        return super(MyModel, self).__init__(*args, **kwargs)
于 2014-10-23T09:06:00.207 回答
1

您可以自定义_create方法。

如果在信号处理程序中创建了外部帐户,您也可以禁用信号。

于 2014-09-16T22:04:07.437 回答
1

您可以使用排除,已在 2.4.0 中添加参见http://factoryboy.readthedocs.org/en/latest/reference.html#factory.FactoryOptions.exclude

于 2016-01-19T13:31:42.020 回答