factory_boy
factory_boy copied to clipboard
Guess the field value type on DjangoModelFactory.
The Suggestion
I think it is very helpful if DjangoFactory generate the field value randomly even we deosn't specify it on the declartion.
As a Django developer, I use both Django-seed, faker, factory-boy. In Django-seed, they generate the random value properly according to the field name even I didn't specify the value directly. for example, if the field name is "first_name", "firstname", "first". they generate proper only first_name. Not the empty string. This is snippet of guessing field value in django-seed with faker.
if name in ('first_name', 'firstname', 'first'): return lambda x: faker.first_name()
But in FactoryBoy, I know as we have to specify the all the field.
Proposed solution
We can consider the solution of django-seed that guessing the field format like below
if name in ('first_name', 'firstname', 'first'): return lambda x: faker.first_name()
if name in ('last_name', 'lastname', 'last'): return lambda x: faker.last_name()
if name in ('username', 'login', 'nickname'): return lambda x:faker.user_name()
if name in ('email', 'email_address'): return lambda x:faker.email()
if name in ('phone_number', 'phonenumber', 'phone'): return lambda x:faker.phone_number()
if name == 'address': return lambda x:faker.address()
if name == 'city': return lambda x: faker.city()
if name == 'streetaddress': return lambda x: faker.street_address()
if name in ('postcode', 'zipcode'): return lambda x: faker.postcode()
if name == 'state': return lambda x: faker.state()
if name == 'country': return lambda x: faker.country()
if name == 'title': return lambda x: faker.sentence()
if name in ('body', 'summary', 'description'): return lambda x: faker.text()
I do agree that default empty fields can be improved at least by inferring on the model field name as @Ambitiont109 suggests. Also model name and field type can be used. I've been thinking about field param choices=[] param could be used to randomly choosing one of the options by default. Everything alterable on the factory level.