【问题标题】:How to generate a random number for a model field using Factory Boy如何使用 Factory Boy 为模型字段生成随机数
【发布时间】:2019-04-30 01:40:12
【问题描述】:

我需要使用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)

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

【问题讨论】:

  • 如果我理解正确(我对factory_boy 没有任何经验)它是一个固定装置,可以重复使用,它似乎只被实例化一次,这个固定装置的范围是你的整个会话。有什么办法可以在factory_boy 中修改你的fixture 的范围吗?
  • 试试fuzzy attribute
  • @KlausD.,我想到了这个选项,但似乎使用惰性属性更简单。
  • @aws_appretice,感谢您的提示。这绝对是使用惰性属性所做的事情。
  • 很高兴你知道了:thumbsup:

标签: python django factory-boy


【解决方案1】:

我能够通过使用lazy attribute (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))

【讨论】:

  • 就我而言,我需要使用 lambda 函数 number_field = factory.LazyAttribute(lambda x: random.randrange(0, 10000))
  • 是的,这个例子将在导入时生成一个随机数...
【解决方案2】:

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

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

Documentation

【讨论】:

  • 添加min_valuemax_value 对您有用吗?我正在尝试对 pydecimal 做同样的事情,但添加 left_digitsright_digits 仍然会使我的测试因数字字段溢出而崩溃
  • 抱歉回复晚了。是的,我发布的内容对我来说是正确的。尝试将左右数字调整为较小的数字,同时调试以查看生成的是哪个数字以及为什么会出现该错误。
【解决方案3】:

就我而言,LazyAttribute 不起作用。

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

import factory.fuzzy

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

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

【讨论】:

    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 2020-10-06
    • 2016-06-03
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多