본문 바로가기

Minding's Programming/Django

[Django] 모델 메소드(Model Method)

728x90
반응형

모델 메소드

모델 메소드는 모델을 클래스로 선언할 때 아래에 작성하는 함수를 메소드로 사용하는 것을 말한다. 예를 들어, Question 모델(클래스)에 pub_date 기준 오늘 만들어진 레코드인지를 판단하는 메소드를 만들어본다고 해보자.

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

# model 생성
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True)

	# pub_date가 지금 -1일 이상인 경우 True
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

 

Shell에서 해당 메소드를 사용해보자.

>>> from polls.models import *
# 예전에 만들었던 질문 레코드
>>> q = Question.objects.first()
>>> q.was_published_recently()
False

# 새로 만든 질문 레코드
>>> new_q = Question(question_text='new_question')
>>> new_q.save()
>>> new_q.was_published_recently()
True

 

해당 메소드를 다른 함수에 적용시켜 응용하는 것도 가능하다.

# model 생성
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True)

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

    # was_published_recently() 함수가 True일 경우 뒤에 new 붙임
    def __str__(self):
        if self.was_published_recently():
            return f'[{self.pub_date}] {self.question_text} (new)'
        else:
            return f'[{self.pub_date}] {self.question_text}'
>>> from polls.models import *
>>> Question.objects.all()
<QuerySet [<Question: [2024-10-07 04:20:27+00:00] 가장 추천하는 가을 캠핑장은 어디인가요
?>, <Question: [2024-10-08 04:34:08.922218+00:00] new_question (new)>]>

위와 같이 new_question에만 (new) 표시가 노출되는 것을 확인할 수 있다.

728x90