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

lmi*_*asf 1 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)
Run Code Online (Sandbox Code Playgroud)

我需要基于这个模型创建一个工厂,我希望价格在 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)
Run Code Online (Sandbox Code Playgroud)

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

Gon*_*alo 10

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

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

文档


lmi*_*asf 6

我能够通过使用惰性属性( factory.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))
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,我需要使用 lambda 函数 ```number_field = factory.LazyAttribute(lambda x: random.randrange(0, 10000))``` (7认同)