首页 > 解决方案 > 伪造一个用于模型测试的语言环境字段

问题描述

我只是在这样的模型中有一组语言:

from django.conf.global_settings import LANGUAGES

class AvailableLanguage(models.Model):
    code = models.CharField(choices=LANGUAGES, unique=True)

factories.py,我想伪造code字段。我试图从中随机获取语言环境代码,LANGUAGES但失败了。它不是创建一个实例AvailableLanguage,而是循环语言并迅速引发问题,因为code设置为unique.

所以我想创建一个 Provider 作为一个单例,但由于同样的原因它失败了。它生成所有语言环境代码,而不是只提供一个!


class Provider(BaseProvider):

    lang_code = NotImplemented

    def __init__(self, generator):
        self.langs = LANGUAGES
        self.generator = generator

    def __getattribute__(self, attrib):
        if attrib == 'lang_code':
            self.lang_code = self.langs.pop()[0]
            return self.lang_code
        else:
            return super().__getattribute__(attrib)


fake.add_provider(Provider)


class AvailableLanguageFactory(DjangoModelFactory):

    code = Faker('lang_code')

    class Meta:
        model = AvailableLanguage

标签: pythondjangotestingfaker

解决方案


您可以尝试使用 工厂男孩的迭代器。

from django.conf.global_settings import LANGUAGES
import factory


class AvailableLanguageFactory(factory.DjangoModelFactory):
    code = factory.Iterator(LANGUAGES, getter=lambda l: l[0])

    class Meta:
        model = AvailableLanguage

推荐阅读