如何使用Factory Boy为模型字段生成随机数

时间:2019-04-30 01:40:13

标签: python django factory-boy

我需要使用factory boy创建一些虚假数据。我有以下模型:

class Fabric(models.Model):
    title = models.CharField(max_length=200, blank=True)
    description = models.CharField(max_length=200, blank=True)
    price = models.DecimalField(decimal_places=2, max_digits=10, null=True, blank=False)

我需要基于此模型创建一个工厂,并且我希望价格具有1到100之间的随机值。

class FabricFactory(DjangoModelFactory):
    class Meta:
        model = Fabric

    title = factory.Faker('name')
    description = factory.Faker('catch_phrase')
    price = random.randrange(MIN_PRICE, MAX_PRICE + 1)

问题在于,我总是为每个实例获得相同的价格。

3 个答案:

答案 0 :(得分:2)

我能够通过使用lazy attributefactory.LazyAttribute)来解决此问题。从文档中:

  

大多数工厂属性都可以使用定义工厂时要评估的静态值来添加,但是某些属性(例如,其值是从其他元素计算得出的字段)在每次生成实例时都需要分配值。

class FabricFactory(DjangoModelFactory):
    class Meta:
        model = Fabric

    title = factory.Faker('name')
    description = factory.Faker('catch_phrase')
    price = factory.LazyAttribute(random.randrange(MIN_PRICE, MAX_PRICE + 1))

答案 1 :(得分:0)

就我而言,LazyAttribute 不起作用。

我发现使用 factory boy 生成 10 位随机数的最佳方法是这样的:

import factory.fuzzy

class CustomUserFactory(DjangoModelFactory):
        phone_number = factory.fuzzy.FuzzyInteger(9000000000, 9999999999)

FuzzyInteger() 中提供的参数是生成随机数的下限和上限。

答案 2 :(得分:0)

您也可以使用 python 提供程序。

class MyModel(factory.django.DjangoModelFactory)
  number_field = factory.Faker('pyint', min_value=0, max_value=1000)
  class Meta:
    model = SomeModel

Documentation