Peter-Slump/django-dynamic-fixtures

View on GitHub
docs/source/index.rst

Summary

Maintainability
Test Coverage
.. Django Dynamic Fixtures documentation master file, created by
   sphinx-quickstart on Wed Jun 15 22:13:22 2016.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

=====================================================
Welcome to the Django Dynamic Fixtures documentation!
=====================================================

`Django Dynamic Fixtures <https://github.com/Peter-Slump/django-dynamic-fixtures>`_
is a Django app which gives you the ability to setup
fixture-data in a more dynamic way. Static fixtures are sometimes too
static in a way that for example even the primary keys are static defined, this
can be very hard to maintain especially in bigger projects. Another example;
when your application depends on data with a recent timestamp your static
fixtures can get 'outdated'.

For all these issues Django Dynamic Fixtures has a solution and even more!

Features:
  - :ref:`write-fixtures` in Python;
  - :ref:`load_fixtures` which are required for your task;
  - Manage fixture :ref:`dependencies`.

Changelog
=========

**0.2.1**

* Added some docs about dry-run mode
* Fixed Django versions in setup.py

**0.2.0**

* Added time elapsed per fixture
* Dry-run mode
* List available fixtures
* Run all fixtures in an transaction
* Removed support for Django 1.7
* Added support for Django 2.0

Installation
============

First install the package::

  $ pip install django-dynamic-fixtures

Add the app to your project's `settings.py` file::

   # settings.py
   INSTALLED_APPS = [
      ...,
      'dynamic_fixtures'
   ]

Or make sure the app is not loaded on production::

   # settings.py
   if DEBUG:
      INSTALLED_APPS = INSTALLED_APPS + ['dynamic_fixtures']


.. _write-fixtures:

Write fixtures
==============

All fixtures are written in .py files the `fixtures`-module of your app.

Recommended is to prefix the fixture files with numbers just like you probably
already know from the `Django migrations <https://docs.djangoproject.com/en/1.7/topics/migrations/#migration-files>`_.:

Inside the fixture file you have to create a class called `Fixture`. This
class should extend from :class:`dynamic_fixtures.fixtures.basefixture.BaseFixture`.

In this class you define at least the `load`-method. In this method you are
free to setup your fixture data in a way you like::

   #my_django_project/my_app/fixtures/0001_create_example_author.py
   from dynamic_fixtures.fixtures import BaseFixture

   from my_app.models import Author


   class Fixture(BaseFixture):

       def load(self):
           Author.objects.create(name="John Doe")


List fixtures
=============

To list all existing fixtures you can call the management command `load_dynamic_fixtures` with an argument `--list`::

  $ ./manage.py load_dynamic_fixtures --list

The output may help to find out the reason why a fixture wasn't loaded.


.. _load_fixtures:

Load fixtures
=============

To load the fixtures you can call the management command `load_dynamic_fixtures`::

  $ ./manage.py load_dynamic_fixtures

You can also specify which fixtures you want to load. In this case the requested
fixture will be loaded plus all depending fixtures. This ensures that you always
have a valid data-set::

   $ ./manage.py load_dynamic_fixtures my_app 0001_create_example_author

Or load all fixtures for a given app::

   $ ./manage.py load_dynamic_fixtures my_app

Dry-run
=======

You can test your fixtures in dry-run mode. Add the `--dry-run` argument to the
management command. Fixtures will loaded as without dry-run enabled however the
transaction will be rolled back at the end::

  $ ./manage.py load_dynamic_fixtures --dry-run


.. _dependencies:

Dependencies
============

It's also possible to maintain dependencies between fixtures. This can be
accomplished in the same way as `Django migrations <https://docs.djangoproject.com/en/1.7/topics/migrations/#migration-files>`_::

    #my_django_project/my_app/fixtures/0002_create_example_books.py
    from dynamic_fixtures.fixtures import BaseFixture

    from my_app.models import Book


    class Fixture(BaseFixture):

       dependencies  = (
          ('my_app', '0001_create_example_author'),
       )


        def load(self):
            author = Author.objects.get(name='John Doe')

            Book.objects.create(title="About roses and gladiolus", author=author)
            Book.objects.create(title="The green smurf", author=author)

The library take care that the depending fixture is loaded before this one, so
you know for sure that the entity is available in the database.

Gotcha's
========

A really powerful combination is a combination of this library and `Factory Boy <https://github.com/rbarrois/factory_boy>`_.
In the example below 50 authors will get created from factories.::


   #my_django_project/my_app/fixtures/0001_create_example_author.py
   from dynamic_fixtures.fixtures import BaseFixture

   from my_app.factories import AuthorFactory


   class Fixture(BaseFixture):

       def load(self):
           AuthorFactory.create_batch(size=50)