Natknąłem się na ten sam problem (używając Django 1.11) i to pytanie było na górze moich wyników Google.
W Twoim początkowym rozwiązaniu brakuje tylko jednego krytycznego elementu. Musisz powiedzieć Django, jakich modeli baz danych 'C' i 'D' używają. Co mi się udało:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
Następnie powiedz routerowi bazy danych, jak się zachować, gdy napotka etykietę app_label w sekcji allow_migrate():
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
Nie jestem pewien, czy jest to najbardziej poprawne rozwiązanie w oczach zespołu Django, ale efektem jest to, że allow_migrate() zwraca False dla wszystkich modeli zdefiniowanych z tą wartością atrybutu app_label.
dokumentacja Django na temat routerów nie wspomina o tym wprost (lub przynajmniej z przykładami kodu modelu, które wyjaśniają, w jaki sposób ORM przekazuje wartość „db” do allow_migrate()), ale można to uzyskać między atrybutami „app_label” i „managed” do pracy*.
* W moim przypadku domyślną bazą jest postgres, a bazą danych tylko do odczytu jest Oracle 12 przez cx_Oracle.