본문 바로가기

Development/Django

[Django] User Model 확장 (2) - 프록시 모델 사용하기

728x90

 

Django Logo

 

프록시 모델 사용하기


개요

프록시 모델이란 새 테이블을 추가하는 등의 데이터베이스 스키마 변경 없이 단순히 상속한 클래스입니다.

더보기

스키마란?

데이터베이스 구조와 전반적인 제약조건에 관한 명세를 기술한 것입니다.

자세히 말하면, 개체의 특성을 나타내는 속성(Attribute)와 속성들의 집합으로 이루어진 개체(Entity), 개체 사이에 존재하는 관계(Relation)에 대한 정의와 이들을 유지해야 할 제약조건들을 기술한 것입니다.

쉽게 말하여, 데이터베이스 내에 어떤 구조로 데이터가 저장되는가를 나타내는 데이터베이스 구조를 스키라라고 합니다.

정렬 순서 같은 기존 모델의 동작을 변경하거나 새로운 메소드를 추가하기 위해 사용합니다.

데이터베이스에 부가적인 사용자 정보를 저장할 필요가 없을 때 사용하는 방법입니다.

구현

프록시 모델 기법은 User Model을 상속하지만 실제로 테이블엔 어떠한 변경도 없습니다.

from django.contrib.auth.models import User
from .managers import PersonManager

class Person(User):
    objects = PersonManager()

    class Meta:
        proxy = True
        ordering = ('first_name', )

    def do_something(self):
        ...

위 코드의 내용을 살펴보면 다음과 같다.

  • User 모델을 상속한 Person 클래스를 정의한다.
  • Meta 내부 클래스를 정의하면서 프록시 모델 클래스임을 선언하고 정렬 순서를 first_name 기준으로 변경합니다.
  • do_something 같은 메소드를 추가할 수 있습니다.
  • User.objects.all()과 Person.objects.all() 코드는 스키마의 변경이 없으므로 같은 쿼리로 동작합니다.
더보기

Meta 내부 클래스 옵션


verbose_name

사용자가 읽기 쉬운 모델 객체의 이름으로 관리자 화면 등에서 표시됩니다. 영어를 기준으로 단수형입니다.

verbose_name 옵션을 지정하지 않으면 CamelCase 클래스 이름을 기준으로 camelcase 이와 같이 모두 소문자로 변경합니다.

verbose_name_plural 옵션

사용자가 읽기 쉬운 모델 객체의 이름으로 관리자 화면 등에서 표시되는 것은 동일하나 영어를 기준으로 복수형이다.

한국어에서는 굳이 단수와 복수를 구별해 사용하지 않으므로 verbose_name과 동일하게 쓸 수 있다.

verbose_name_plural 옵션을 지정하지 않으면 verbose_name에 s를 붙인다.

ordering 옵션

모델의 정렬 순서를 지정하며 여러 개를 지정할 경우 필드 이름을 리스트로 나열한다. 기본값은 오름차순으로 정렬하고 -를 붙이면 내림차순으로 정렬한다.

다음 예시는 pub_date 필드 기준 내림차순으로 정렬하고 다시 author 필드를 기준으로 오름차순 정렬한다.

ordering = ['-pub_date', 'author']

 

 

Tip) 주요 메소드가 위치하는 순서

  1. 모든 데이터베이스 필드
  2. 커스텀 매니저 속성
  3. Meta 클래스
  4. def __init__() 메소드
  5. def __str__() 메소드
  6. def save() 메소드
  7. def get_absolute_url() 메소드
  8. 기타 커스텀 메소드
728x90