Как установить длину для полей Python Faker

Я пытаюсь настроить UserFactory, используя DjangoModelFactory из factory_boy и Faker. Вот мой код

fake = Faker('uk_UA')

class UserFactory(DjangoModelFactory):
    class Meta:
        model = User

    username = fake.user_name
    first_name = fake.first_name_male
    last_name = fake.last_name_male

    email = fake.safe_email

Но когда я пытаюсь использовать его, я получаю ошибку:

    DataError                  Traceback (most recent call last)
/Users/mero/.virtualenvs/fine-hut/lib/python3.6/site-packages/django/db/backends/utils.py in execute(self, sql, params)
     63             else:
---> 64                 return self.cursor.execute(sql, params)
     65

DataError: value too long for type character varying(30)

Я предполагаю, что проблема в слишком длинных полях, созданных Faker. Но я не нашел способа ограничить его длину в python, хотя нашел несколько ответов для Ruby Faker.

Есть ли способ сделать это в Python Faker? Или, может быть, есть какой-то другой способ использовать Faker для генерации специфичных для локали полей?

2 ответа

Две возможности, которые сработали для меня:

Вариант 1: LazyAttribute Если вы оцениваете это вне factory_boyВ реализации Faker, вы можете передать это в метод фабрики LazyAttribute и взять длину этого:

from faker import Factory as FakerFactory
faker = FakerFactory.create()

class MyFactory(DjangoModelFactory):
    class Meta:
        model = MyModel
    some_attr = factory.LazyAttribute(lambda n: faker.sentence()[:10])

Вариант 2: Нечеткий вместо фейкера: Если вы не заботитесь о потере фактических атрибутов провайдера, и все будет в порядке со случайной строкой текста заданной длины, вы можете сделать:

import factory.fuzzy   # necessary; can't just do import factory

class MyFactory(DjangoModelFactory):
    class Meta:
        model = MyModel
    some_attr = factory.fuzzy.FuzzyText(length=10)

Нашли обходное решение:

class UserFactory(DjangoModelFactory):
    class Meta:
        model = User

    username = factory.Faker('user_name', locale='uk_UA')
    first_name = factory.Faker('first_name', locale='uk_UA')
    last_name = factory.Faker('last_name', locale='uk_UA')

    email = factory.Faker('safe_email', locale='uk_UA')

Это работает для меня, но все еще интересно, если есть возможность установить длину поля в Faker.

Другие вопросы по тегам