Allow specification of a global, per-app or per-model database table name prefix.
-
Some (external) projects automatically use a database prefix for interaction with a database. This is particularly common in implementations of the Active Record pattern.
-
It is possible to define an explicit database table name in the Meta class on a model; however, this is not as easily accomplished when dealing with a third-party application. By providing a high-level interface for adding prefixes there is a simple, consistent way to achieve this goal other than forking the code or ad-hoc monkey patching.
-
Install using pip:
pip install git+https://github.com/benslavin/django-db-prefix.git
-
Add django_db_prefix at the top of your INSTALLED_APPS list. It is recommended that django_db_prefix is the first listed application, but it is essential that it be loaded before the initialization of any model you expect to be modified.
Three configuration options are allowed: global, per-app or per-model. In all cases, the specified prefix will be prepended exactly as provided -- no delimiter will be added.
In all cases, behavior is controlled by the DB_PREFIX
setting.
To add a common prefix to all models simply set DB_PREFIX
to the string that
you want to be prepended.
DB_PREFIX = "foo"
For example, for the model bar_app.models.Baz the default table would be:
bar_app_baz
By setting DB_PREFIX
to foo
, the table would be foo_bar_app_baz
.
Both per-application and per-model prefixes are controlled by the use of a
dictionary as the value of DB_PREFIX
, where the dictionary contains keys
allowing the lookup of a given model or application.
When DB_PREFIX
is a dictionary, django_db_prefix
will perform the following
searches to determine the prefix to use. First match wins; if no matches are
found, no prefix will be added.
app_label.model_name
following the standard Django convention, wheremodel_name
is converted to lowercase before attempting to match.app_label
whereapp_label
is the name of the application.None
allowing for a global default when using the dictionary specification format.
A sample specification:
DB_PREFIX = {
"foo.bar": "bar_model_prefix",
"foo.baz": "baz_model_prefix",
"foo": "foo_app_backup_prefix",
"wobble": "wobble_app_prefix",
None: "default_prefix"
}