You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让工厂创建模型时使用objects.create_user而非objects.create

如何让Django Factory使用create_user而非create实例化用户模型?

默认情况下,DjangoModelFactory会调用Model.objects.create()来创建实例,这就导致你遇到的问题——即使没传入User模型必填的username字段,实例依然能被创建(因为create()不会触发create_user()里的校验逻辑)。要解决这个问题,只需要重写工厂类的_create方法,指定使用create_user来创建实例。

修改后的工厂类代码如下:

@register
class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = User

    # 可选:设置默认字段值,避免每次创建都手动传入必填项
    username = factory.Faker('user_name')
    email = factory.Faker('email')
    # 可选:处理密码,自动调用set_password生成哈希
    password = factory.PostGenerationMethodCall('set_password', 'testpass123')

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        # 获取模型的manager,调用create_user方法
        manager = cls._get_manager(model_class)
        return manager.create_user(*args, **kwargs)

关键说明:

  • 重写_create方法是Django Factory自定义实例创建逻辑的标准方式,通过它可以替换默认的create方法为create_user
  • 添加默认字段(如username、email)可以让你在调用user_factory.create()时不用每次都传入必填项,同时如果手动传入这些字段,会覆盖默认值
  • PostGenerationMethodCall用于在实例创建后调用set_password方法,确保密码被正确哈希存储,这比直接设置明文密码更符合Django的安全规范

现在再运行你的测试代码:

@pytest.fixture
def new_user2(user_factory):
    return user_factory.create(first_name='abc')

如果没有传入username且工厂也没设置默认值,会直接触发create_user的必填字段校验错误,符合预期。

内容的提问来源于stack exchange,提问作者meg hidey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:25:32