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

如何在Django Rest Framework中用FactoryBoy生成不同产品条目?

解决factory_boy生成重复产品标题的问题

问题根源是你直接在类字段上调用fake.word(),这行代码会在类加载时就执行一次,后续所有通过工厂创建的实例都会复用这个预先生成好的值,导致所有产品标题完全相同。

修复方案

有两种标准方式解决这个问题,推荐使用第二种:

方式1:使用factory.LazyAttribute

延迟字段值的生成,每次创建实例时才调用Faker方法:

# factories.py
from factory import LazyAttribute

class ProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Product

    title = LazyAttribute(lambda _: fake.word(part_of_speech='noun'))
    # 其他字段保持不变...

方式2:使用factory.Faker(推荐)

factory_boy原生集成了Faker,不需要自己初始化Faker实例,每次创建实例时会自动生成新值:

# factories.py
# 无需手动初始化fake: Faker = Faker()

class CollectionFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Collection
        django_get_or_create = ('title', )

    title = factory.Faker('word', part_of_speech='noun')


class ProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Product

    title = factory.Faker('word', part_of_speech='noun')
    slug = factory.Faker('slug')
    description = factory.Faker('text')
    unit_price = factory.Faker('pydecimal', max_value=1000, min_value=1, right_digits=2)
    inventory = factory.Faker('random_number', digits=4)
    last_update = factory.Faker('date_time_ad', start_datetime=datetime(1998, 1, 1, 1, 1, 1), end_datetime=datetime.now())
    collection = factory.SubFactory(CollectionFactory)

额外说明

如果你的测试中需要每个产品对应不同的Collection,也要确保CollectionFactory的title字段使用上述两种方式之一,否则django_get_or_create=('title', )会导致所有产品复用同一个Collection实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:52:41