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
반응형