인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ajdsasld님의 프로필 이미지
ajdsasld

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

장식자와 클래스 관련 질문입니다!

작성

·

163

0

안녕하세요, 강사님! 비전공자이지만 개발자가 되기 위해 python & django를 공부하고 있습니다. 이제 models 부분을 수강하고 있지만 항상 자세하게 설명해주셔서 많은 도움이 되고 있습니다!

먼저 첫번째 질문은, 위와 같이 models.py에서 Post 모델을 정의할 때 class Post(models.Model): -> 이 코드는 djnago 디렉터리 내부에 -> db 디렉터리에 -> models라는 모듈을 import하고, 그 내부에 Model이라는 클래스를 상속받았다고 해석하면 될까요?

그리고 Post 모델 클래스 내부에 필드를 정의할 때도, message = models.TextField() -> 이렇게 column를 입력하고 모듈인 models에 있는 TextField() 함수를 사용한다라고 이해하면 될까요?

 

두번째 질문은 admin.py에서 사용된 장식자 질문입니다.

위와 같이 Post라는 모델을 admin에 등록할 때, 

@admin.register(Post)             

class PostAdmin(admin.ModelAdmin):

    list_display = ['id', 'message', 'created_at', 'updated_at']

    list_display_links = ['message']

 

이러한 코드를 저는 "django 디렉터리에 있는 -> contrib 디렉터리에 -> admin 모듈을 Import 해서, 그 admin에 Post 라는 모델 클래스를 등록하고, 장식자로 설정하기" 

그리고, "admin 모듈의 ModelAdmin 클래스를 상속받아 PostAdmin이라는 새로운 클래스를 정의하고,  밑에 추가한 list_display 리스트는, 우리가 설정한 장식자인 Post 모델 클래스에 추가해서 사용하는 것" 이라고 해석을 해봤는데 맞는 내용인지 모르겠습니다.

장식자에 대한 내용은 https://bluese05.tistory.com/30 해당 블로그를 참고해서 이해하려고 했는데요, '이미 정의된 함수나 클래스를 장식자로 설정하고 추가로 변경하고 싶은 함수위에 장식자를 사용한다'라고 이해하고 있습니다.

막연히 프로젝트를 진행했을 때는 '어 이게 되네' 라면서 재미를 느꼈는데, 코드 한 줄 한 줄의 의미를 내가 모르고 있다라는 것을 느끼면서 개발자가 되려고 하는 사람이 코드에 대한 설명이 안되면 면접때도 바로 떨어지고, 이러면 안되겠다 싶어 코드 한 줄을 내가 이해하고 있는지 공부하려고 합니다..  해당 내용 확인해주시면 감사하겠습니다!

 

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

django 팩키지 내에 db/models/ 경로가 디렉토리이므로 django/db/models/__init__.py 를 임포트하게 됩니다. models.Model 클래스를 상속받아서 새로운 모델 클래스를 정의할 수 있습니다.

github 저장소를 통해 models 디렉토리 내역도 살펴보세요. :-)

하나의 모델 클래스를 하나의 DB 테이블과 1:1로 매핑을 시키고, DB 컬럼과 1:1 매핑을 시킬 필드들을 해당 모델 클래스 내에 하나씩 message = models.TextField() 와 같은 방법으로 선언합니다. models.CharField, models.TextField, models.DateTimeField 등은 모두 클래스로서, 상속을 통해 커스텀 모델 필드를 정의할 수 있습니다.

클래스 내에 직접적으로 필드를 선언하는 문법은 파이썬의 descriptor라는 문법인데요. 이는 고급문법이기에 지금 깊게 살펴보시기보다 이름 정도 기억하시면 충분합니다.

각 장고 모델을 admin 페이지에서 사용할려면, 해당 모델을 admin에 등록하는 과정이 필요합니다.

모델만 등록하면 "기본 옵션"의 ModelAdmin이 적용이 되구요.

등록 시에 모델과 함께 커스텀 ModelAdmin 클래스를 상속/정의하여 "커스텀 옵션"을 지정하실 수 있습니다.

위와 같이 쓰시면, PostAdmin은 "커스텀 옵션"이 지정되지 않았기에 PostAdmin을 지정하지 않은 "기본 옵션"의 ModelAdmin과 동작이 동일합니다.

ModelAdmin에 지정할 수 있는 "커스텀 옵션"은 장고 admin 공식 문서를 통해 확인하실 수 있습니다. list_display, actions, date_hierarchy 등이 있습니다.

ModelAdmin에서는 register시에 장식자 문법도 지원해줍니다. 위 PostAdmin을 다음과 같이 정의하실 수 있습니다.

장식자는 함수나 클래스를 감싸서(래핑, wrapping) 원본 함수/클래스에 기능을 더한 새로운 함수/클래스를 생성하는 문법입니다. 이는 리액트/자바스크립트에서도 유사한 컨셉이 많이 사용되고 있습니다.

아래 mysum1 함수의 mysum1(1, 2) 리턴값은 3이 됩니다.

그런데, 아래 mysum2 함수는 base_10 장식자로 감싸진 함수이며, mysum2(1, 2) 의 리턴값은  13이 됩니다. base_10 장식자를 통해 기본 계산값에 10이 더해진 값이 리턴된 거죠.

장식자 문법은 파이썬 2.4에 추가된 문법으로서, 장식자 문법을 적용하지 않고 다음과 같이 풀어서 쓸 수도 있습니다. 파이썬 2.4 이전에는 아래와 같이 코드를 썼었던 거죠. 장식자 문법을 통해 코드가 보다 간결해졌습니다.

인터넷 블로그 상의 컨텐츠들은 명확히 정리되지 않은 컨텐츠들이 많습니다. 그나마 책이 정리된 컨텐츠가 많죠. 파이썬 문법 책들은 아주 많고 좋은 책들도 많기에, 파이썬 문법은 책 중심으로 정리하시면서 차근차근 살펴보시길 추천드립니다. 장고는 파이썬을 잘 하는 만큼 더 잘할 수 있습니다.

책을 한두권만 보실 것이 아니라, 적어도 서너권을 보시며 다양한 시각으로 문법을 학습해보세요. 도서관에도 파이썬 책이 많으니까 빌려보시기도 수월하실 것입니다.

살펴보시고 다양한 질문 부탁드립니다. 

왕도는 없습니다. 차근차근 화이팅입니다. :-)

ajdsasld님의 프로필 이미지
ajdsasld
질문자

이렇게 자세하게 답변해주셔서 정말 감사합니다!! 

그렇다면 from django.contrib import admin 이라는 코드 역시,

django/contrib/admin 디렉터리 내부의 __init__.py를 import 하게 되는 것이고,

그 안에 ModelAdmin 클래스를 상속받는 것으로 이해하면 되는 거겠죠?!

 

또한, @admin.register(Post) 라는 장식자 코드도 

admin 디렉터리 내부에 decorators.py 에 있는 register 함수를 래핑한 것으로 이해해봤습니다!

 

 

그리고 강사님이 링크걸어주신 django GitHub 저장소가 내용을 이해하는데 도움이 많이 되었는데요,  이 github은 djnago가 공식으로 운영하고 있는 github 저장소라고 생각하면 될까요? 

 

덕분에 훨씬 명확하게 이해가 되는 같습니다. 앞으로 python 문법도 공부하면서 계속 강의 따라가 보겠습니다!

 

이진석님의 프로필 이미지
이진석
지식공유자

예. 임포트와 상속 부분은 설명하신 내용이 맞습니다.

github.com/django/django 저장소는 django 공식 저장소입니다.

admin.site.register와는 별개로 register 이름의 장식자가 있습니다. 아래 코드를 보시면, register 장식자 내부적으로 admin.site.register 를 호출하고 있음을 확인하실 수 있습니다.

https://github.com/django/django/blob/3.0.14/django/contrib/admin/decorators.py#L1

화이팅입니다~!! :-)

ajdsasld님의 프로필 이미지
ajdsasld
질문자

빠르게 답변해주셔서 정말 감사합니다! 앞으로도 고민을 해보고 모르는 게 있다면 다시 질문드리겠습니다. 감사합니다:)

ajdsasld님의 프로필 이미지
ajdsasld

작성한 질문수

질문하기