私は(Django 1.11を使用して)同じ問題に遭遇しました、そしてこの質問はそれのための私のグーグル結果の一番上にありました。
最初の解決策には、重要な部分が1つだけ欠けています。 「C」と「D」が使用しているデータベースモデルをDjangoに伝える必要があります。私のために働いたこと:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
次に、allow_migrate()セクションでそのapp_labelに遭遇したときの動作方法をデータベースルーターに指示します。
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
それがDjangoチームの観点から見て最も正しい解決策であるかどうかはわかりませんが、そのapp_label属性値で定義されたモデルに対してallow_migrate()がFalseを返すという効果があります。
Django ルーターに関するドキュメント これについては明示的に言及していません(または、少なくともORMが「db」の値をallow_migrate()に渡す方法を明確にするモデルコードサンプルでは)が、「app_label」属性と「managed」属性の間で取得できます動作する*。
*私の場合、デフォルトはpostgresで、読み取り専用データベースはcx_Oracle経由のOracle12です。