Setkal jsem se se stejným problémem (pomocí Django 1.11) a tato otázka byla v horní části mých výsledků Google pro ni.
Vašemu počátečnímu řešení chybí pouze jeden kritický kousek. Musíte Djangovi sdělit, jaké databázové modely 'C' a 'D' používají. Co se mi osvědčilo:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
Poté řekněte svému databázovému routeru, jak se má chovat, když narazí na app_label v sekci allow_migrate():
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
Nejsem si jistý, že je to v očích týmu Django nejsprávnější řešení, ale efekt je, že allow_migrate() vrací False pro všechny modely definované s touto hodnotou atributu app_label.
dokumentace o směrovačích Django nezmiňuje to explicitně (nebo alespoň s ukázkami modelového kódu, které objasňují, jak ORM předává hodnotu pro 'db' do allow_migrate()), ale mezi atributy 'app_label' a 'managed' to můžete získat do práce*.
* V mém případě je výchozí postgres a databáze pouze pro čtení je Oracle 12 přes cx_Oracle.