【Django】 아무래도 다른 앱의 테이블을 사용하고 싶은 경우의 도망길

소개



다른 앱의 테이블을 사용하는 방법에 대해 알아보는 데 약간의 시간이 걸렸기 때문에 기사로 둡니다.

해결 방법



방법은 크게 두 가지 있습니다.

1. 사용하려는 테이블의 모델을 import하여 사용



이번 해설하는 것은 이쪽의 방법.

2. 앱을 통합합니다.



테이블을 공유하고 싶은 앱끼리 하나의 앱으로 통합됩니다. .
Django의 기본 사상인 「각 앱끼리는 의존관계를 가져서는 안 된다」라고 하는 룰에 준거하면 이쪽이 정공법입니다.

간단히 설명하면, 앱 A, B가 있었을 때, A의 앱상에서 정의된 테이블을 B가 사용한다는 것은, B는 A가 존재하는 것으로 처음으로 성립되는 앱이 된다=「B는 A 에 의존하고 있다”는 것이기 때문입니다.

라고 해도 이미 프로덕션 환경에서 움직이고 있는 시스템에 대해 앱을 통합하는 대개조를 할 수 없는 때도 있다고 생각합니다. 이 기사에서는 그럴 때 사용할 수 있는 도망길을 소개합니다.
※ 아직 개발중인 경우나 수정이 늦지 않은 경우 방법 2를 강하게 추천합니다.

포인트



PyCharm 또는 VSCode를 사용하는 경우 오류 검사가 표시되지만 (다른 IDE, 편집기에서도 아마 표시됩니다) 무시하십시오.
Python은 import원은 같은 계층이나 아래의 계층에 있을 필요가 있다고 하는 규칙이 있습니다만, 깎아지른 방법으로 어떻게든 import하는 수법입니다.

해설



실제로 앱 A와 앱 B를 만들고 B에서 A 테이블을 보러갑니다.

※ 전제로서 Python은 인스톨이 끝난 것으로 합니다.
다음 명령으로 장고 앱 만들기
> mkdir django-model-test
> cd django-model-test
django-model-test> python -m venv venv
django-model-test> venv\Scripts\activate  # Windowsの場合
django-model-test> source venv/bin/activate  # Mac,Linuxの場合
(venv) django-model-test> pip install django
(venv) django-model-test> mkdir Src
(venv) django-model-test> cd Src
(venv) django-model-test\Src> django-admin startproject config .
(venv) django-model-test\Src> python manage.py runserver

localhost : 8000에 액세스하여 장고 데모 화면이 표시되면 여기까지 OK입니다.


Ctrl+C로 테스트 서버를 종료하고 계속 진행합니다.
다음 명령 실행
django-model-test\Src> python manage.py startapp appA
django-model-test\Src> python manage.py startapp appB

settings.py의 INSTALLED_APPS에 추가

django-model-test\Src\config\settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 追記
    'appA.apps.AppaConfig',
    'appB.apps.AppbConfig'
]

urls.py 설정

django-model-test\Src\config\urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('appB/', include('appB.urls', namespace='appB'))
]

django-model-test\Src\appB\urls.py
from django.urls import path
from . import views

app_name = 'appB'
urlpatterns = [
    path('', views.top_page, name='top_page'),
    ]
]

index.html (및 대상 디렉토리) 만들기

django-model-test\Src\appB\templates\appB\index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    参照成功!
</body>
</html>

appA의 models.py에 테스트 테이블 만들기

django-model-test\Src\appA\models.py
from django.db import models


class AppATable(models.Model):

    sample = models.TextField()


터미널에서 migrate 실행
django-model-test\Src> python manage.py makemigrations
django-model-test\Src> python manage.py migrate

마지막으로 중요한 Views.py 만들기! 아마도 세 번째 줄은 참조를 해결할 수 없어 오류가 발생하지만 무시하십시오.
※반드시 migrate하고 나서 작성해 주세요

django-model-test\Src\appB\views.py
from django.shortcuts import render
from django.views.generic import View
from appA.models import AppATable


class TopPageView(View):
    def get(self, request, *args, **kwargs):

        appATable_data = AppATable.objects.all()
        print(appATable_data.values())

        return render(request, 'appB/index.html')


top_page = TopPageView.as_view()


DB에 테스트용 데이터를 넣습니다.
이번에는 IDE에서 했지만 도구가없는 분은 Django 관리 사이트에서 넣어도 괜찮습니다.


이상으로 준비 완료입니다.
테스트 서버를 시작하고 [localhost:8000/appB]에 액세스해 봅시다.
브라우저에 「참조 성공!」의 문자가 표시되어 터미널에서 print문의 결과(appATable의 내용)가 표시되어 있으면 OK입니다.



  
  
이상으로 종료입니다.
고마워요

좋은 웹페이지 즐겨찾기