-
TIL.68 __str__은 무엇일까TIL/Django 2020. 12. 15. 14:55728x90
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'TIL > Django' 카테고리의 다른 글
TIL.70 auto_now VS auto_now_add 차이 (0) 2020.12.17 TIL.69 FloatField 활용하기 (0) 2020.12.16 TIL.64 (Token)_Authentication (0) 2020.12.11 TIL.58 Django Rest Framework_serializer(직렬화) (0) 2020.12.06 TIL.57 null=True 와 blank=True 의 차이(Django) (0) 2020.12.05