如何在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
相关产品推荐
相关产品推荐

