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

如何用factory_boy创建调用自定义函数的工厂(非SubFactory)

直接调用自定义函数的工厂实现(非SubFactory方式)

假设你使用的是Factory Boy库,要创建一个直接调用现有生成函数的工厂,核心是重写工厂的_create方法,或者用LazyFunction包装你的函数,下面是具体实现方式:

基础实现(无参数传递)

如果你的生成函数不需要额外参数,直接返回处理好关联的对象列表,可以这样定义工厂:

import factory

# 你已实现的生成函数
def generate_complex_objects():
    # 这里是你的业务逻辑,返回带关联的对象列表
    obj1 = YourModel(name="obj1")
    obj2 = RelatedModel(parent=obj1, value=100)
    return [obj1, obj2]

class ComplexObjectListFactory(factory.Factory):
    class Meta:
        model = list  # 工厂生成的是列表类型

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        # 直接调用你的生成函数并返回结果
        return generate_complex_objects()

使用时直接实例化工厂即可:

object_list = ComplexObjectListFactory()

支持参数传递的实现

如果需要给生成函数传递自定义参数,只需在工厂中接收参数,再传给生成函数:

class ComplexObjectListFactory(factory.Factory):
    class Meta:
        model = list

    # 定义默认参数,可在实例化时覆盖
    item_count = 2

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        # 取出工厂参数,传递给生成函数
        count = kwargs.get('item_count')
        return generate_complex_objects(count=count)

使用时可以指定参数:

# 用默认参数生成
default_list = ComplexObjectListFactory()
# 传递自定义参数
custom_list = ComplexObjectListFactory(item_count=5)

另一种方式:使用LazyFunction

也可以用factory.LazyFunction来包装你的生成函数,简化工厂定义:

class ComplexObjectListFactory(factory.Factory):
    class Meta:
        model = list

    # 用LazyFunction直接关联生成函数
    _result = factory.LazyFunction(generate_complex_objects)

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        return kwargs['_result']

这种方式适合不需要参数传递的场景,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:00:48