python - Factory Boy 随机选择字段选项 "choices"

标签 python django factory django-testing factory-boy

当 Django 模型中的字段具有选项选项时,请参阅 Django choices field option ,它利用包含 2 个项目的可迭代对象的可迭代对象来定义允许哪些值。例如:

模型

class IceCreamProduct(models.Model):
    PRODUCT_TYPES = (
        (0, 'Soft Ice Cream'),
        (1, 'Hard Ice Cream'),
        (2, 'Light Ice Cream'),
        (3, 'French Ice Cream'),
        (4, 'Italian-style Gelato'),
        (5, 'Frozen Dairy Dessert'),
    )
    type = models.PositiveSmallIntegerField('Type', choices=PRODUCT_TYPES, default=0)

要在 Factory Boy 中为选择生成一个随机值,我会使用 factory.fuzzy.FuzzyChoice,但这只会选择 2 个项目的迭代。它不能采用所选迭代器的第一项。例如:

工厂

class IceCreamProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = IceCreamProduct

    type = factory.fuzzy.FuzzyChoice(IceCreamProduct.PRODUCT_TYPES)

错误

TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'

获取元组的第一项是不可能的。例如:

工厂

class IceCreamProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = IceCreamProduct

    type = factory.fuzzy.FuzzyChoice(IceCreamProduct.PRODUCT_TYPES)[0]

错误

TypeError: 'FuzzyChoice' object does not support indexing

可以使用默认的 Python 随机迭代器,但这会在声明时生成一个值,因此每个工厂对象都将具有相同的随机值。例如:

工厂

class IceCreamProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = IceCreamProduct

    type = random.choice(IceCreamProduct.PRODUCT_TYPES)][0]

如何在 Factory Boy 中解决这个问题?我需要创建自定义 FuzzyAttribute 吗? (如果是,请举例说明)

最佳答案

您不需要 FuzzyAttribute。

您可以通过执行以下操作来限制可能的值并仅将每种产品类型的 int 值提供给 FuzzyChoice:

PRODUCT_IDS = [x[0] for x in IceCreamProduct.PRODUCT_TYPES]
class IceCreamProductFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = IceCreamProduct

    type = factory.fuzzy.FuzzyChoice(PRODUCT_IDS)

它应该完成工作。

请注意模糊模块最近已被弃用,请参阅 ( https://factoryboy.readthedocs.org/en/latest/fuzzy.html ),您可能想改用 LazyFunction。

关于python - Factory Boy 随机选择字段选项 "choices",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641568/

相关文章:

python - Django 中的两个查询集序列化为 JSON

Java工厂模式,创建特定的类

python - numpy.vectorize : Why so slow?

python - 根据值对列表进行切片

python - 使用 git 部署

c++ - 在 C++ 工厂方法的实现中遇到继承问题

c# - 类实例创建限制

python - 在Qt4上安装MayaVi会导致段错误

python - PIL 逊相关系数 2 尾 p 值含义

Django storages S3 - 存储现有文件