Brobin / django-seed

:seedling: Seed your Django database with fake data
MIT License
687 stars 86 forks source link

|seed-logo|

===========

Django-seed uses the faker_ library to generate test data for your Django models. This has been "hard-forked" from django_faker_ in order to support newer versions of Python and Django

Django-seed allows you to write code to generate models, and seed your database with one simple manage.py command!


|python| |pypi| |actions| |coveralls| |license| |downloads|




Installation

To install django-seed, use pip::

pip install django-seed

Or to install from source::

python setup.py install

Configuration

Add it to your installed apps in settings.py::

INSTALLED_APPS = (
    ...
    'django_seed',
)

Usage

Note: When seeding models with Foreign Keys, you need to make sure that those models are seeded first. For example, if a model in app A has a foreign key to a model in app B, you must seed app B first.

Using with command

With django-seed, you can seed your database with test data from the command line using the manage.py seed command.

Ex: Seed 15 of each model for the app api:

.. code-block:: bash

$ python manage.py seed api --number=15

That's it! Now you have 15 of each model seeded into your database.

Should you need, you can also specify what value a particular field should have. For example, if you want to seed 15 of MyModel, but you need my_field to be the same on all of them, you can do it like this:

.. code-block:: bash

$ python manage.py seed api --number=15 --seeder "MyModel.my_field" "1.1.1.1"

This is the command equivalent to doing it in Python:

.. code-block:: python

seeder.add_entity(MyModel, 10, {
    'my_field': '1.1.1.1',
})

Using with code

django-seed provides methods to easily seed test databases for your Django models. To seed your database with Model instances, import Seed, get a seeder instance, and use the add_entity method.

Ex: seeding 5 Game and 10 Player objects:

.. code-block:: python

from django_seed import Seed

seeder = Seed.seeder()

from myapp.models import Game, Player
seeder.add_entity(Game, 5)
seeder.add_entity(Player, 10)

inserted_pks = seeder.execute()

The seeder uses the name and column type to populate the Model with relevant data. If django-seed misinterprets a column name or column type and AttributeError(field) is thrown, you can still specify a custom function to be used for populating a particular column, by adding a third argument to the add_entity() method:

.. code-block:: python

seeder.add_entity(Player, 10, {
    'score':    lambda x: random.randint(0, 1000),
    'nickname': lambda x: seeder.faker.email(),
})
seeder.execute()

Django-seed does not populate auto-incremented primary keys, instead seeder.execute() returns the list of inserted PKs, indexed by class:

.. code-block:: python

print inserted_pks
{
    <class 'faker.django.tests.Player'>: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    <class 'faker.django.tests.Game'>: [1, 2, 3, 4, 5]
}

You may specify a different locale by passing it in the constructor of the seeder. Defaults to settings.LANGUAGE_CODE

.. code-block:: python

seeder = Seed.seeder(locale='sv_SE')
seeder.faker.city()  # 'Västerås'

Localization

Seed.seeder() can take a locale as an argument, to return localized data. You can find all possible locales in faker's documentation_

In order to apply localization, do the next:

.. code-block:: python

seeder = Seed.seeder('it_IT')

Tests

To run django tests in a django environment, first make sure you have the packages from requirement-test.txt installed, then run the following:

.. code-block:: bash

$ python runtests.py

or if you have django_seed in INSTALLED_APPS:

.. code-block:: bash

$ python manage.py test django_seed

License

MIT. See LICENSE_ for more details.

.. _faker: https://www.github.com/joke2k/faker/ .. _django_faker: https://www.github.com/joke2k/django-faker/ .. _faker's documentation: https://faker.readthedocs.io/en/latest/locales.html .. _LICENSE: https://github.com/Brobin/django-seed/blob/master/LICENSE

.. |pypi| image:: https://img.shields.io/pypi/v/django-seed.svg?style=flat-square :target: https://pypi.python.org/pypi/django-seed :alt: pypi

.. |actions| image:: https://github.com/Brobin/django-seed/workflows/Test/badge.svg :target: https://github.com/Brobin/django-seed :alt: Actions Build

.. |coveralls| image:: https://img.shields.io/coveralls/Brobin/django-seed.svg?style=flat-square :target: https://coveralls.io/r/Brobin/django-seed :alt: coverage

.. |license| image:: https://img.shields.io/github/license/Brobin/django-seed.svg?style=flat-square :target: https://github.com/Brobin/django-seed/blob/master/LICENSE :alt: MIT License

.. |python| image:: https://img.shields.io/pypi/pyversions/django-seed.svg?style=flat-square :target: https://pypi.python.org/pypi/django-seed :alt: Python 3.x

.. |seed-logo| image:: assets/django_seed.png :alt: Django Seed

.. |downloads| image:: https://pepy.tech/badge/django-seed :target: https://pepy.tech/project/django-seed :alt: downloads