본문 바로가기
개발/Django

[Django] 장고 어드민에서 외래키로 연결되지 않은 테이블을 Inline으로 넣기

by Byeongdori 2022. 9. 2.
반응형

장고는 어드민 페이지를 통해 DB와 매핑된 모델들의 리스트, 각각 개체들의 필드 값, 정보들까지 확인할 수 있습니다.

 

실무에서는 어드민 페이지를 효과적으로 잘 구성하는 것 또한 서비스의 유지 보수, 데이터 분석, 에러 복구를 위한 중요한 작업입니다.

 

다대다(ManyToMany), 일대다(Foreignkey)로 연결된 모델 또한 Inline과 같은 방법과 함께 다양한 방법으로 참조가 가능해 관련성 높은 데이터들을 한 번에 보여줄 수 있지만

 

때로는 모델 상에선 관계가 없지만, 실무에서는 연관되어 자주 쓰이는 데이터를 한 번에 보여줄 필요성이 있을 때가 존재합니다.

 

오늘은 외래 키로 연결되지 않은, 즉 모델끼리 아무런 연관성이 없는 테이블을 Inline으로 삽입하는 방법에 대해 알아보겠습니다.

 

장고에서는, 이런 경우를 해결하기 위해 django-nonrelated-inlines라는 별도의 라이브러리를 사용합니다. 

 

- django-nonrelated-inlines 라이브러리 설치

 

django-nonrelated-inlines

Django admin inlines for unrelated models

pypi.org

 

- 라이브러리의 사용 코드 예시

# NonrelatedTabularInline도 사용 가능
from nonrelated_inlines.admin import NonrelatedStackedInline
from django.contrib import admin

class CustomerInvoiceStackedInline(NonrelatedStackedInline):
    model = Invoice
    fields = [
        'id',
        'amount'
    ]

    # 가져올 쿼리셋 정의
    def get_form_queryset(self, obj):
        return self.model.objects.filter(email=obj.email)
	
    # Inline에서 정의한 모델이 저장되는 경우에 동작
    def save_new_instance(self, parent, instance):
        instance.email = parent.email
        
 class A(admin.ModelAdmin):
 
    inlines = [CustomerInvoiceStackedInline]
    
    ...

 

먼저 추가적으로 연결할 model과 fleld를 Inline Class 내 정의해주고, 두 가지 함수를 오버 라이딩합니다.

 

1. def get_form_queryset(self, obj)

  - 모델 객체 상세 페이지 내 inline로 보일 객체의 쿼리셋들을 가져오는 ORM입니다.

  - 위의 예시의 경우, CustomerInvoiceStackedInline이 A model의 Admin에 들어간다고 가정한다면,

     Invoice의 email 필드가 A의 email 필드와 같은 쿼리셋들을 가져옵니다.

 

2. def save_new_instance(self, parent, instance)

  - 어드민 페이지에서 Inline Class에서 정의한 model 객체가 저장될 때 호출되는 함수입니다.

  - 저장 시 추가적으로 들어갈 로직이 있는 경우에 작성하며, 선택사항입니다.

 

이제 일반 Inline을 사용하는 것처럼, 타 모델 내에 넣어 사용하면 아래에 Inline Admin이 들어오게 됩니다.

반응형
SMALL

'개발 > Django' 카테고리의 다른 글

[Django] Django Cache with Redis  (0) 2022.05.23

댓글