Django Meta Class(Ordering, db_table, verbose_name, etc)

Error Coder·2023년 2월 21일
0

장고의 메타 클래스

Python 웹 프레임워크인 장고(Django)는 모델이라는 추상화된 클래스를 사용하여 데이터베이스에 테이블을 정의합니다.
이 모델은 models.Model을 계승시킨 클래스로서 작성합니다만, 이 클래스내에는 Meta(메타) 라고 하는 내부 클래스를 배치할 수가 있습니다.

모델의 클래스내에 Meta 클래스를 정의하는 것으로 Django 의 그 모델의 취급 방법을 변경하는 것이 가능합니다.
또, 모델에 한정하지 않고 Meta 클래스는 form등에도 설정할 수 있습니다.

이 글에서는 Meta 클래스의 일부 기능에 대해 설명합니다.
구체적으로는 ↓를 살펴 보겠습니다.

  • Meta 클래스 개요
  • Meta 클래스를 작성하는 방법
  • ordering을 작성하는 방법
  • db_table을 작성하는 방법
  • verbose_name, verbose_name_plural을 작성하는 방법

Meta 클래스 개요

Django의 Meta 클래스는 모델 클래스 내에 배치됩니다.
그리고 Meta 클래스는 Django의 모델에 취급하는 방법을 변경할 수 있습니다.
Meta 클래스내에 예약된 속성을 써, 값으로 초기화하는 것으로 변경이 기능합니다.

장고는 내부적으로이 Meta 클래스를 참조합니다.
그런 다음 속성과 속성 값을 참조하여 해당 모델의 개체를 처리하는 방법을 변경하거나 관리 사이트의 표시를 변경합니다.
이 Meta 클래스를 사용하면 Django를 보다 편리하게 사용할 수가 있습니다.

Meta 클래스를 작성하는 방법

Meta 클래스는 ↓처럼 씁니다.

from django.db import models


class Post(models.Model): 
    no = models.IntegerField() 
    name = models.CharField(max_length=128)

    # 이것 
    class Meta: 
        pass

↑와 같이 Meta 클래스는 모델 클래스 내부에 씁니다.
속성을 아무것도 쓰지 않는 경우는 Meta 클래스는 아무것도 작용하지 않습니다.
Meta 클래스가 작동하려면 예약된 속성과 속성 값을 작성해야 합니다.

예약된 속성은 많이 있습니다만, 그에 대해서는 ↓의 문서를 봐 주세요.

ordering을 작성하는 방법

Meta 클래스의 ordering속성은 객체의 기본 정렬 방법을 변경할 때 사용됩니다.
ordering예를 들면 ↓처럼 씁니다.

from django.db import models


class Post(models.Model): 
    no = models.IntegerField() 
    name = models.CharField(max_length=128)

    class Meta: 
        # 오름차순 
        # ordering = ['no']

        # 내림차순 
        ordering  =  [ '-no' ]

Meta 클래스 안에 ordering을 써, 그 값을 리스트로 초기화합니다.
일부 목록은 문자열로 order을 작성합니다.
order는 필드 이름과 하이픈(-)의 조합으로 표시됩니다.
예를 들어 no필드의 값으로 객체를 정렬하고 싶은 경우는 인자로 'no'을 기입합니다.
그리고 오름차순으로 정렬하고 싶은 경우는 하이픈 없이, 내림차순으로 정렬하고 싶은 경우는 하이픈 있도록 사용합니다.

ordering를 쓰면 객체를 얻을 때 그 값으로 객체가 정렬됩니다.
예를 들면 ordering = ['no']↓와 같은 출력이 되고,

>>> Post.objects.all()
<QuerySet [<Post: Post object (1)>, <Post: Post object (2)>, <Post: Post object (3)>]>

ordering = ['-no']의 경우는 ↓와 같이 됩니다.

>>> Post.objects.all()
<QuerySet [<Post: Post object (3)>, <Post: Post object (2)>, <Post: Post object (1)>]>

db_table을 작성하는 방법

db_table는 모델 데이터베이스의 테이블 이름을 변경합니다.
db_table는 ↓과 같이 사용합니다.

from django.db import models


class Post(models.Model): 
    no = models.IntegerField() 
    name = models.CharField( max_length = 128 )

    class Meta : 
        # 테이블 이름을 mypost로 변경 
        db_table = 'mypost'

↑ 와 같이 db_table를 정의하면 모델이 참조하는 테이블 이름이 설정한 값이 됩니다.
↑와 같이 변경한 후에 python manage.py makemigrations실행하면 테이블 이름을 변경하는 마이그레이션 파일이 작성됩니다.
그리고 python manage.py migrate 실행하면 테이블 이름이 변경됩니다.

db_table을 정의한 후에 마이그레이션을 잊지 않고 실행하도록 합시다.

verbose_name, verbose_name_plural을 작성하는 방법

verbose_name과 verbose_name_plural는 관리 사이트의 모델의 표기 방법을 변경합니다.
이러한 속성은 ↓와 같이 사용합니다.

from django.db import models


class Post(models.Model): 
    no = models.IntegerField() 
    name = models.CharField(max_length=128)

    class Meta: 
        verbose_name = '포스트'  # 단수형 
        verbose_name_plural = '포스트 그룹'  # 복수형

verbose_name에는 모델의 단수형의 이름을 지정합니다.
verbose_name_plural에는 모델의 복수형의 명칭을 지정합니다.
이 두 속성을 ↑로 설정하면 관리 사이트의 모델의 단수형 이름은 '포스트'가 되고 복수형은 '포스트 그룹'이 됩니다.
Django는 이러한 속성을 관리 사이트에서 모델을 볼 때 참조합니다.

profile
개발자 지망생

0개의 댓글