터칭 데이터

장고(Django) 모델 메소드 본문

장고 (Django)

장고(Django) 모델 메소드

터칭 데이터 2023. 11. 2. 16:19

모델 메서드

 

우리가 지금까지 쉘에서 사용했던 save()는 모델 메서드입니다.

 

쉘에서 메모리상으로 남아있던 작업을 DB 테이블에 적용하는 메서드였는데요.

 

우리가 save() 메서드를 사용할 수 있었던 것은

 

 

우리가 models.py에서 모델 클래스를 정의할 때 model 라이브러리의 Model을 상속받았기 때문입니다.

우리는 지금까지 이 Model에 있는 save() 메서드를 사용했던 것입니다.

 

 

 

 

 

모델 메서드 직접 만들기

 

장고에서는 우리가 사용할 모델 메서드들을 직접 손수 정의해서 사용할 수 있습니다.

 

Question에 대해서 최근에 생성된 question인지 알아보는 메서드를 구현해 보겠습니다.

 

 

 

24시간 내에 만들어진 최근 question인지를 판단해주는 메서드 was_published_recently를 timezone과 datetime 라이브러리의 도움을 받아 만들었습니다.

 

우리는 모델을 변경했으므로 쉘을 사용하려면 다시 쉘을 껐다 켜야합니다!

 

 

새로 작성한 메서드가 잘 작동하는지 확인해봅시다.

>>> from polls.models import *
>>> q = Question.objects.first()
>>> q
<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2023-10-31 14:19:40+00:00>


>>> q.was_published_recently()
False


>>> new_q = Question(question_text='new question')
>>> new_q.save()
>>> new_q.was_published_recently()
True

 

q는 우리가 만든지 24시간이 지났는지 False가 뜹니다.

new_q로 방금 만든 데이터는 24시간이 지나지 않았기 때문에 True가 뜹니다.

 

 

 

 

새로 작성된 question인지 제목에 표시해주기

우리가 작성한 was_published_recently() 메서드를 이용해 제목에 NEW를 달아주도록 코드를 작성해봅시다.

 

이제 question이 24시간 이내에 작성되었다면 NEW!!!가 제목 앞에 붙을 것입니다.

 

 

 

모델을 변경했으니 쉘을 껐다 켜고

 

>>> from polls.models import *
>>> Question.objects.all()
<QuerySet [
    <Question:  제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2023-10-31 14:19:40+00:00>, 
    <Question:  제목: 가장 좋아하는 디저트는?, 날짜: 2023-10-31 14:22:37+00:00>, 
    <Question:  제목: 커피 vs 녹차, 날짜: 2023-11-01 05:37:56.580508+00:00>, 
    <Question:  제목: abc???, 날짜: 2023-11-01 05:51:02.905096+00:00>, 
    <Question: NEW!!! 제목: 휴가를 가실 계획인가요?, 날짜: 2023-11-02 03:36:12.245190+00:00>, 
    <Question: NEW!!! 제목: new question, 날짜: 2023-11-02 07:09:10.103398+00:00>
]>

 

Question의 모든 데이터를 쿼리셋으로 불러오니

작성한지 24시간이 지나지 않은 question들은 제목 앞에 NEW!!!가 붙은 것을 확인할 수 있습니다.

 

 

이렇게 모델내에서 필요한 기능, 반복되는 기능은 모델 메서드로 정의하면 유용하니 잘 숙지하시기를 바랍니다.