터칭 데이터
장고(Django) 모델 메소드 본문
모델 메서드
우리가 지금까지 쉘에서 사용했던 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!!!가 붙은 것을 확인할 수 있습니다.
이렇게 모델내에서 필요한 기능, 반복되는 기능은 모델 메서드로 정의하면 유용하니 잘 숙지하시기를 바랍니다.
'장고 (Django)' 카테고리의 다른 글
장고(Django) 뷰(Views) (0) | 2023.11.02 |
---|---|
왜 장고는 View 메서드에서 request를 파라미터로 가질까? (0) | 2023.11.02 |
장고(Django) 모델 관계기반 필터링 (0) | 2023.11.02 |
장고(Django) 모델 필터링(Model Filtering) 2 (0) | 2023.11.01 |
장고(Django) 모델 필터링(Model Filtering) (0) | 2023.11.01 |