Ik kwam hetzelfde probleem tegen (met Django 1.11) en deze vraag stond bovenaan mijn Google-resultaten ervoor.
Uw initiële oplossing mist slechts één cruciaal onderdeel. U moet Django vertellen welke databasemodellen 'C' en 'D' gebruiken. Wat werkte voor mij:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
Vertel uw databaserouter vervolgens hoe hij zich moet gedragen wanneer hij dat app_label tegenkomt in de allow_migrate()-sectie:
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
Ik weet niet zeker of dit de meest correcte oplossing is in de ogen van het Django-team, maar het effect is allow_migrate() die False retourneert voor alle modellen die zijn gedefinieerd met die app_label-kenmerkwaarde.
De Django documentatie over routers vermeldt dit niet expliciet (of in ieder geval met modelcodevoorbeelden die duidelijk maken hoe de ORM de waarde voor 'db' doorgeeft aan allow_migrate()), maar tussen de 'app_label' en 'managed' attributen kun je het krijgen aan het werk*.
* In mijn geval is de standaard postgres en de alleen-lezen database Oracle 12 via cx_Oracle.