ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL.68 __str__은 무엇일까
    TIL/Django 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
Designed by Tistory.