Jeg stødte på det samme problem (ved brug af Django 1.11), og dette spørgsmål var øverst i mine Google-resultater for det.
Din første løsning mangler kun én kritisk brik. Du skal fortælle Django, hvilke databasemodeller 'C' og 'D' bruger. Hvad virkede for mig:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
Fortæl derefter din databaserouter, hvordan den skal opføre sig, når den støder på denne app_label i sektionen allow_migrate():
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
Jeg er ikke sikker på, at det er den mest korrekte løsning i Django-teamets øjne, men effekten er, at allow_migrate() returnerer False for alle modeller, der er defineret med denne app_label-attributværdi.
Django dokumentation om routere nævner ikke dette eksplicit (eller i det mindste med modelkodeeksempler, der gør det klart, hvordan ORM sender værdien for 'db' til allow_migrate()), men mellem attributterne 'app_label' og 'managed' kan du få det at arbejde*.
* I mit tilfælde er standarden postgres, og den skrivebeskyttede database er Oracle 12 via cx_Oracle.