treyhunner/django-simple-history

View on GitHub
docs/multiple_dbs.rst

Summary

Maintainability
Test Coverage
Multiple databases
==================

Interacting with Multiple Databases
-----------------------------------

`django-simple-history` follows the Django conventions for interacting with multiple databases.

.. code-block:: python

    >>> # This will create a new historical record on the 'other' database.
    >>> poll = Poll.objects.using('other').create(question='Question 1')

    >>> # This will also create a new historical record on the 'other' database.
    >>> poll.save(using='other')


When interacting with ``QuerySets``, use ``using()``:

.. code-block:: python

    >>> # This will return a QuerySet from the 'other' database.
    Poll.history.using('other').all()

When interacting with manager methods, use ``db_manager()``:

.. code-block:: python

    >>> # This will call a manager method on the 'other' database.
    >>> poll.history.db_manager('other').as_of(datetime(2010, 10, 25, 18, 4, 0))

See the Django documentation for more information on how to interact with multiple databases.

Tracking User in a Separate Database
------------------------------------

When using ``django-simple-history`` in app with multiple database, you may run into
an issue where you want to track the history on a table that lives in a separate
database to your user model. Since Django does not support cross-database relations,
you will have to manually track the ``history_user`` using an explicit ID. The full
documentation on this feature is in :ref:`Manually Track User Model`.

Tracking History Separate from the Base Model
---------------------------------------------
You can choose whether or not to track models' history in the same database by
setting the flag `use_base_model_db`.

.. code-block:: python

    class MyModel(models.Model):
        ...
        history = HistoricalRecords(use_base_model_db=False)

If set to `True`, migrations and audit
events will be sent to the same database as the base model. If `False`, they
will be sent to the place specified by the database router. The default value is `False`.