Python/초간단 장고 Django

7. Django: ORM-Method, __str__()

컴닥 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__()을 같이 작성해주면 디버깅이 편해집니다. ^^

 

진짜 끝입니다. ^^ 

감사합니다.

반응형