python - 출력 - django 외부 db




django에서 동일한 테이블 이름으로 여러 데이터베이스에서 데이터 가져 오기 (2)

Django (Django 1.11.7, Python 3.5.2) 에서 가져온 다른 MySQL 데이터베이스에서 데이터를 가져와야합니다. manage.py inspectdb --database '<db>' 를 실행 한 다음 django에서 모델을 사용합니다.

지금까지는 다른 이름의 테이블 만 액세스해야했습니다. 이를 위해 queryset에서 using 키워드를 사용하여 적절한 데이터베이스를 지정하고 다음과 같이 결과를 연결합니다.

from ..models.db1 import Members
from ..models.db2 import Actor

context['db1_data'] = Members.objects.using('db1').filter...
context['db2_data'] = Actor.objects.using('db1').filter...

context["member_list"] = list(chain(
    context["db1_data"],
    context["db2_data"],
))

return context

이제는 두 데이터베이스에 같은 모델 이름의 테이블이 있다는 문제가 있습니다. 위에서 언급 한 메서드를 사용할 때 다음 오류가 발생합니다 (이름을 대체했습니다).

RuntimeError: Conflicting '<table-name>' models in application '<app>': <class '<app>.<subfolder>.models.<db1>.<table-name>'> and <class '<app>.<subfolder>.models.<db2>.<table-name>'>.

이미 다음과 같이 다른 이름으로 모델 가져 오기를 시도했습니다.

from ..models.db3 import Members as OtherMembers

그러나 여전히 오류가 발생합니다.

from ..models.db1from ..models.db2 에서 Django가 두 모델의 차이점을 발견 할 수있을만큼 명확하지 from ..models.db2 합니까?

하나의 옵션은 아마도 모델 자체의 이름을 바꾸는 것이지만, 그것은 모든 데이터베이스 모델의 이름을 같은 이름으로 바꾸는 것을 의미합니다. 앞으로 더 많은 데이터베이스를 사용할 것이므로이 옵션이 아닙니다.

나는 from models import db1, db2db1.Members 등에서 오류를 발생 시키려고 시도 from models import db1, db2 .

메타 db_table = 'dbname.tablename' 에 대해 읽었지 만, db_table = 'dbname.tablename' 통해 모델이 자동 생성 inspectdb 모든 클래스에 이미 이와 같은 내용이 있습니다.

class MyModel(models.Model):
    <models>

    class Meta:
        managed = False
        db_table = 'my_model'

앞에서 설명한 것처럼 다른 데이터베이스는 정확히 동일한 모델이므로 동일한 메타 클래스가 있습니다. 나는 모든 메타 수업을 바꿀 수 없으며 그렇게하고 싶지도 않습니다.

편집하다:

프로젝트 구조는 다음과 같습니다.

app
    -> admin.py
    -> ...
    -> models.py
    -> views.py
    subfolder
        -> models
            -> db1.py
            -> db2.py
        -> views
            -> db1.py
            -> db2.py

db1.Members와 db3.Members가 동일한 정의를 갖는 경우 각 데이터베이스에 대해 Members 클래스를 따로 따로 재 선언 할 필요가 없습니다.

Models.py

...
class Members(models.Model): # Only declared once ever!
    ....

그때,

from Models import Members

context['db1_data'] = Members.objects.using('db1').filter...
context['db3_data'] = Members.objects.using('db3').filter...

... # continue processing

..models.db1과 ..models.db2에서 Django가 두 모델의 차이점을 발견 할 수있을 정도로 명확해야합니까?

Django 모델은 스키마에 특화된 데이터베이스와 다르므로 두 개의 서로 다른 데이터베이스에 동일한 테이블이 있으면 model.Models 확장하는 한 클래스로 충분합니다. 그런 다음 객체를 검색하려고 할 때 using()using() 데이터베이스를 지정하거나 Django 문서 https://docs.djangoproject.com/en/2.0/topics/db/multi-db/#an-example 에서 읽을 수있는 라우터를 사용 https://docs.djangoproject.com/en/2.0/topics/db/multi-db/#an-example


여러 데이터베이스를 올바르게 설정했다고 가정 합니다 .

  1. 맞춤 라우터 를 추가하려고 했습니까?
    그렇지 않으면 문서 링크에 제시된 예를 따르십시오.

  2. 모델에 사용자 정의 관리자 를 사용하려고 시도 했습니까?

    다음과 같이 각 모델에 대한 관리자를 만듭니다.

    class YourModelManagerX(models.Manager):
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).using('your_db_X')

    그런 다음 해당 모델에 objects 필드로 추가하십시오.

    class YourModel(models.Model):
        ...
        fields
        ...
        objects = YourManagerX()
    
        class Meta:
            managed = False

한 번에 두 가지를 시도해야 할 수도 있습니다.





database