Unable to save with save_model using database router

If you want to stick with multiple dbs (with relations), all you need to do is implement a allow_relations method in your router that returns True when you are accessing the relation.


The problem you are encountering arises from the difficulty of storing relations between objects that are stored in two distinct databases. In your example, you stated that you have created one database to store all Django contributed objects, which includes User objects created by the auth app. Meanwhile, the second model's objects will be stored in a distinct and entirely separate database. When you attempt to create a relationship between the new object stored in one database and the User object, you are attempting cross-database relations.

Cross-database relations are a difficult problem which has not been solved yet when using multiple databases in Django. If you would like more information about this issue, the Django documentation has a brief note about this problem (copied below for clarity).

Django doesn’t currently provide any support for foreign key or many-to-many relationships spanning multiple databases. If you have used a router to partition models to different databases, any foreign key and many-to-many relationships defined by those models must be internal to a single database.

This is because of referential integrity. In order to maintain a relationship between two objects, Django needs to know that the primary key of the related object is valid. If the primary key is stored on a separate database, it’s not possible to easily evaluate the validity of a primary key.

If you’re using Postgres, Oracle, or MySQL with InnoDB, this is enforced at the database integrity level – database level key constraints prevent the creation of relations that can’t be validated.

However, if you’re using SQLite or MySQL with MyISAM tables, there is no enforced referential integrity; as a result, you may be able to ‘fake’ cross database foreign keys. However, this configuration is not officially supported by Django.