TIL/Django
TIL.68 __str__은 무엇일까
codermun
2020. 12. 15. 14:55
728x90
반응형
Django 모델링 공부시 거의 대부분 __str__ 메서드가 사용되는 것을 어렵지 않게 볼 수 있다.
그럼 __str__ 메서드를 왜 사용하는지 알아보자.
__str__
해당 클래스로 만들어진 인스턴트를 자체를 출력할 때, 문자열로 설명해주기 위한 메서드이다.
Django의 models.py에서는 class가 admin 페이지에서 어떻게 출력되는지 정의해주는 역할이라 볼 수 있겠다.
아래와 같은 Question 클래스의 3가지 column이 있는 상황을 생각해보자
class Question(models.Model):
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
class Meta:
db_tables = questions
현재 DB에는 아래와 같은 데이터를 저장하고 있다 생각하자
>>> from django.utils import timezone
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=timezone.now())
>>> q.save()
>>>
>>>
>>>
>>> q = Question(subject='장고 모델 질문입니다.', content='id는 자동으로 생성되나요?', create_date=timezone.now())
>>> q.save()
>>> q.id
QuerySet API -> all() 을 사용할 경우 아래와 같이 해당 QuerySet 객체를 가져와
Question 객체를 보여준다.
id 값에 정보가 있는지에 대한 여부만 확인 가능하며 정확히 어떤 정보가 있는지는 추가로 메서드들을 사용해줘야 한다.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>
위와 동일한 상황에서 __str__ 메서드를 적용해보면 어떻게 결과가 달라질까
class Question(models.Model):
subject = models.CharField(max_length=200)
content = models.TextField()
create_date = models.DateTimeField()
class Meta:
db_table = questions
# ---------------------------------------- [edit] ---------------------------------------- #
def __str__(self):
return self.subject
# ---------------------------------------------------------------------------------------- #
그럼 다시 한번 데이터를 읽어보자
아래와 같이 Question 객체가 인스턴스 자체로 표현되는 것이 아닌 문자열로 표현되는 것을 볼 수 있다.
>>> from pybo.models import Question, Answer
>>> Question.objects.all()
<QuerySet [<Question: pybo가 무엇인가요?>, <Question: 장고 모델 질문입니다.>]>
>>>
사실상 QuerySet API 와 object에 익숙해져있다보니 오히려 데이터를 읽어올때 혼란스러울 수 있을 것 같지만
개발자가 아닌 제3자가 보았을때는 확실히 가독성을 높혀주기는 하는 것 같다.
결국 이러한 용도로 인스턴스 자체를 문자열로 보여주기 위해 사용한다.
728x90
반응형