Post에 상태 필드 추가하기

Kangjik Kim·2025년 1월 8일
0

블로그의 일반적인 기능으로 게시물을 임시로 저장하는 기능이 있다.

블로그 게시물의 상태를 관리할 수 있는 상태 필드를 추가해,
Draft(임시) 및 Published(게시됨)을 게시물에 대한 상태로 사용해보자.

blog의 models.py를 다음과 같이 편집하자.

from django.db import models
from django.utils import timezone

# Create your models here.

class Post(models.Model):

    class Status(models.TextChoices):
        DRAFT = 'DF', 'Draft'
        PUBLISHED = 'PB', 'Published'

    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250)
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(
        max_length=2, choices=Status.choices, default=Status.DRAFT)

    class Meta:
        ordering = ['-publish']
        indexes = [
            models.Index(fields=['-publish']),
        ]

    def __str__(self):
        return self.title

models.TextChoices를 상속해 열거형 클래스 Status를 정의했다.

게시 상태에 사용할 수 있는 선택 항목은 DRAFT 및 Published이다.

각각의 값은 DF, PB이며 레이블은 Draft, Published이다.

Post.Status.choices에 액세스해 사용 가능한 선택 항목을,

Post.Status.labels에 액세스해 사람이 읽을 수 있는 명칭을,

Post.Status.values에 액세스해 선택 항목의 실제 값을 얻을 수 있다.

또한 CharField의 인스턴스인 status필드를 모델에 추가했는데,

필드 값을 Status, choices의 선택 항목으로 제한하는 choices 매개 변수가 포함되어 있다.

그리고 default 매개 변수를 통해 필드의 기본 값을 DRAFT로 설정했다.

상태의 선택 항목을 사용하는 방법을 살펴보자.

터미널에서 다음 명령을 실행해 파이썬 쉘을 연다.

python manage.py shell

그리고 Post 모델을 import 한다.

from blog.models import Post

각 선택항목의 접근법과 반환 값은 다음과 같다.

아래의 코드를 입력하면 같은 아래와 같은 결과를 반환할 것이다.

In [2]: Post.Status.choices
Out[2]: [('DF', 'Draft'), ('PB', 'Published')]

In [3]: Post.Status.labels
Out[3]: ['Draft', 'Published']

In [4]: Post.Status.values
Out[4]: ['DF', 'PB']

In [5]: Post.Status.names
Out[5]: ['DRAFT', 'PUBLISHED']

In [6]: Post.Status.PUBLISHED
Out[6]: Post.Status.PUBLISHED

또한 아래와 같이 특정 항목에 액세스할 수 있고, 해당 항목의 속성에도 접근할 수 있다.

In [7]: Post.Status.PUBLISHED.label
Out[7]: 'Published'

In [8]: Post.Status.PUBLISHED.name
Out[8]: 'PUBLISHED'

In [9]: Post.Status.PUBLISHED.value
Out[9]: 'PB'

0개의 댓글