ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. Django: ORM-Method, __str__()
    Python/초간단 장고 Django 2019. 7. 8. 22:38
    반응형

    연재 중 꼭 설명해야 할 부분은 아니지만, 안 하기도 아쉬운 부분이 있어 정리해 보았습니다. 

     

    Bookmark object (x)

    이건 장고 어드민에서나 {{object_list}}에서 보이는 부분인데 보기 좋지 않습니다. 

     

    이 부분을 수정하려면 모델에 __str__() 메서드를 추가해야 합니다. 

    # bookmarks/models.py
    
    from django.db import models
    
    
    class Bookmark(models.Model):
        title = models.CharField(max_length=40, blank=True, null=True)
        url = models.URLField('url', unique=True)
    
        def __str__(self):  # 추가
            return self.title

    이제 데이터를 입력해보면 Bookmark object (x) 대신 입력한 title을 볼 수 있습니다. ^^

     

    그런데 title을 넣지 않고 url만 입력한 경우 에러가 발생합니다. ㅠ,.ㅠ

    __str__ returned non-string (type NoneType)

    title 대신 None이 리턴되었고, 
    파이썬의 None은 문자열이 아니기 때문입니다. 

    __str__ 은 문자열을 리턴해야 합니다. 

    (문자열을 리턴해야 하는 이유도 뒤에 설명 드리겠습니다.)

     

    2가지 방법으로 해결할 수 있습니다. 

     

    하나는 self.title을 str()로 감싸주는 방법입니다. 

    None 객체가 스트링으로 변환되기 때문에 에러를 피할 수 있습니다. 

    # bookmarks/models.py
    
    from django.db import models
    
    
    class Bookmark(models.Model):
        title = models.CharField(max_length=40, blank=True, null=True)
        url = models.URLField('url', unique=True)
    
        def __str__(self):
            return str(self.title)  # 수정

     

    또, title이 None일 때 url을 리턴해주는 방법도 있습니다. 

    이 방법이 좀 더 그럴싸하지 않습니까?

    # bookmarks/models.py
    
    from django.db import models
    
    
    class Bookmark(models.Model):
        title = models.CharField(max_length=40, blank=True, null=True)
        url = models.URLField('url', unique=True)
    
        def __str__(self):  # 수정
            return self.title if self.title else self.url
    
    

     

    '1. None을 스트링으로 변환했을 때', '2. title 대신 url을 리턴했을 때'의 결과를 캡처해 보았습니다. 

    정상적으로 잘 작동합니다. 

     

    이제 __str__ 메서드가 궁금해지시죠? 알아보겠습니다. 

    (문자열을 리턴해야 하는 이유에 대한 답도 됩니다.)

    class Cat:
        def __init__(self, name):
            self.name = name
    
    
    my_cat = Cat("미묘냥")
    print(my_cat)
    

    위 코드를 실행하면 결과는 다음과 같습니다. 

    <__main__.Cat object at 0x0080DE10>

    다음 코드를 실행하면 '미묘냥' 이 출력됩니다. 

    class Cat:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
           return self.name
    
    
    my_cat = Cat("미묘냥")
    print(my_cat) # 미묘냥
    

    '__str__'은 객체를 문자열로 표현할 때 사용하는 메서드입니다.

     

    예) 객체를 프린트하는 경우,

    객체 내에 __str__() 메서드가 있으면,

    __str__() 메서드에서 리턴해주는 문자열을 출력하게 됩니다. 

     

    새로운 클래스를 작성할 때 __str__()을 같이 작성해주면 디버깅이 편해집니다. ^^

     

    진짜 끝입니다. ^^ 

    감사합니다.

    반응형
Designed by Tistory.