我正在尝试使用来自factory_boy和Faker的DjangoModelFactory设置UserFactory。 这是我的代码。
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生成特定于语言环境的字段?
答案 0 :(得分:1)
对我有用的两种可能性:
选项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:模糊代替Faker: 如果您不关心丢失提供程序的实际属性,并且只需要设置长度的随机字符串,就可以了,
import factory.fuzzy # necessary; can't just do import factory
class MyFactory(DjangoModelFactory):
class Meta:
model = MyModel
some_attr = factory.fuzzy.FuzzyText(length=10)
答案 1 :(得分:0)
找到了解决方法:
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中设置字段长度,那么它仍然很有用。