在这样的模型中,我只是拥有一组语言:
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
。
因此,我想到了将提供程序创建为单例,并且由于相同的原因而失败。它生成所有语言环境代码,而不是仅提供一个!
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
答案 0 :(得分:1)
您可以尝试使用Iterator 来自工厂男孩。
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