Saya mengalami masalah yang sama (menggunakan Django 1.11) dan pertanyaan ini ada di bagian atas hasil Google saya untuk itu.
Solusi awal Anda hanya kehilangan satu bagian penting. Anda perlu memberi tahu Django model basis data apa yang digunakan 'C' dan 'D'. Apa yang berhasil untuk saya:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
Kemudian beri tahu router basis data Anda bagaimana berperilaku saat menemukan app_label di bagian allow_migrate():
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
Saya tidak yakin itu adalah solusi yang paling benar di mata tim Django, tetapi efeknya adalah allow_migrate() mengembalikan False untuk model apa pun yang ditentukan dengan nilai atribut app_label itu.
Django dokumentasi pada router tidak menyebutkan ini secara eksplisit (atau, setidaknya dengan contoh kode model yang memperjelas bagaimana ORM meneruskan nilai untuk 'db' ke allow_migrate()), tetapi antara atribut 'app_label' dan 'managed' Anda bisa mendapatkannya untuk bekerja*.
* Dalam kasus saya defaultnya adalah postgres dan database read-only adalah Oracle 12 melalui cx_Oracle.