Generate (factory_boy) Model Factory for each model of your Django app
- 1.0.4 fix has_choices property for Django 3.0
- 1.0.3 Remove useless print statements
- 1.0.2 Add
PointFieldFaker
to supportPointField
. Refactor the way modules are imported on generated factories - 1.0.1 Add more accurate fakers for
BigIntegerField
,IntegerField
,PositiveIntegerField
,PositiveSmallIntegerField
andSmallIntegerField
- 1.0.0 Init project
This Django app generates factory_boy Model Factories from your installed apps, so you need to have factory_boy installed.
Install using pip
:
pip install django_factory_generator
Add factory_generator
to your INSTALLED_APPS
settings.
INSTALLED_APPS = (
...
'factory_generator',
...
)
Generate factories with a single command line:
python manage.py generate_factories
This will create a model_factories
directory with the following structure :
|__ model_factories/
|__ app_label_foo/
|__ __init__.py
|__ model_foo.py
|__ model_bar.py
|__ base/
|__ __init__.py
|__ model_foo.py
|__ model_bar.py
Each model results in two generated files :
- model_factories/app_label_foo/base/model_foo containing the
ModelFooFactoryBase
class definition generated from the modelModelFoo
. This file should not be manually edited since it would be overriden each time the commandgenerate_factories
is run. - model_factories/app_label_foo/model_foo containing the
ModelFooFactory
class which simply extendsModelFooFactoryBase
. This file is generated once but not overriden when you run thegenerate_factories
command again.
This structure gives you the ability to override the ModelFactory that was automatically generated. You can then edit the ModelFooFactory
to change / edit the base fields that were generated.
You can then import your model factories the following way:
# app_label/tests.py
from django.test import TestCase
from model_factories.app_label import ModelFooFactory, ModelBarFactory
class FooTests(TestCase):
def test_model_factory(self):
modelfoo = ModelFooFactory(
foo='bar',
)
modelbar = ModelBarFactory(
bar='baz',
)
# Run your tests here
Here are all the settings you can use, with their default value :
FACTORY_NORMALIZE_FIELD_MAP = {}
FACTORY_FIELD_FAKER_MAP = {}
FACTORY_IGNORE_FIELDS = []
FACTORY_ROOT_DIR = 'model_factories'
FACTORY_IGNORE_NON_EDITABLE_FIELDS = True
- Improve documentation
- Write unit tests
- validate compatibility with previous versions of Django and Python
If you are having issues, please let us know or submit a pull request.
The project is licensed under the MIT License.