更改factory_boy中的默认faker区域设置

时间:2017-08-19 16:40:04

标签: python django factory-boy

如何在Python的factory_boy中为我的所有工厂设置默认语言环境?

在文档中说,应该用factory.Faker.override_default_locale设置它,但这对我的骗子没有任何作用......

import factory
from app.models import Example
from custom_fakers import CustomFakers

# I use custom fakers, this indeed are added
factory.Faker.add_provider(CustomFakers)
# But not default locales
factory.Faker.override_default_locale('es_ES')

class ExampleFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Example

    name = factory.Faker('first_name')


>>> from example import ExampleFactory
>>> e1 = ExampleFactory()
>>> e1.name
>>> u'Chad'

4 个答案:

答案 0 :(得分:4)

Faker.override_default_locale()是一个上下文管理器,虽然从文档中不是很清楚。

这意味着您应该在代码中使用其中一种形式:

with factory.Faker.override_default_locale('es_ES'):
    ExampleFactory()

或者:

@factory.Faker.override_default_locale('es_ES')
def test_foo(self):
    user = ExampleFactory()

答案 1 :(得分:3)

我和你的问题一样。对于临时解决方案,请尝试在factory.Faker中传递区域设置。

例如:

name = factory.Faker('first_name', locale='es_ES')

答案 2 :(得分:3)

这不是一个好的解决方案,但就目前而言,它已经足够了。您可以更改保存值的variable

import factory
factory.Faker._DEFAULT_LOCALE = 'xx_XX'

此外,您可以创建这样的文件(app/faker.py

import factory
from faker.providers import BaseProvider

factory.Faker._DEFAULT_LOCALE = 'xx_XX'

def fake(name):
    return factory.Faker(name).generate({})

def faker():
    return factory.Faker._get_faker()

class MyProvider(BaseProvider):
    def category_name(self):
        return self.random_element(category_names)
    ...
factory.Faker.add_provider(MyProvider)

category_names = [...]

然后,一旦导入文件,语言环境就会更改。此外,您还可以从供应商那里获得在工厂外使用factory_boy伪造者的简便方法:

from app.faker import f
print(fake('random_int'))
print(faker().random_int())

答案 3 :(得分:0)

使用Django,您只需在<myproject>/settings.py中插入以下行:

import factory
factory.Faker._DEFAULT_LOCALE = 'fr_FR'