Tôi gặp phải vấn đề tương tự (sử dụng Django 1.11) và câu hỏi này nằm ở đầu kết quả Google của tôi cho vấn đề đó.
Giải pháp ban đầu của bạn chỉ thiếu một phần quan trọng. Bạn cần cho Django biết những mô hình cơ sở dữ liệu 'C' và 'D' đang sử dụng. Điều gì đã hiệu quả với tôi:
class ExternalModel(models.Model):
class Meta:
managed = False
abstract = True
app_label = 'support'
Sau đó, cho bộ định tuyến cơ sở dữ liệu của bạn biết cách hoạt động khi nó gặp phải app_label đó trong phần allow_migrate ():
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'support':
return False
return (db == 'default')
Tôi không chắc đó là giải pháp đúng đắn nhất trong mắt nhóm Django, nhưng hiệu ứng là allow_migrate () trả về False cho bất kỳ mô hình nào được xác định bằng giá trị thuộc tính app_label đó.
Django tài liệu về bộ định tuyến không đề cập đến điều này một cách rõ ràng (hoặc, ít nhất là với các mẫu mã mô hình làm rõ cách ORM chuyển giá trị cho 'db' thành allow_migrate ()), nhưng giữa các thuộc tính 'app_label' và 'Managed', bạn có thể nhận được nó để làm việc *.
* Trong trường hợp của tôi, mặc định là postgres và cơ sở dữ liệu chỉ đọc là Oracle 12 thông qua cx_Oracle.