기술블로그-Django편

📂 Django 모델에서 str() 함수 작동 흐름 완벽 해설

Chansman 2025. 5. 14. 16:39

📂 Django 모델에서 str() 함수 작동 흐름 완벽 해설

Django 프로젝트에서 __str__() 메서드는 객체를 문자열로 어떻게 표현할지를 결정합니다. 이는 admin 페이지, 쉘 출력, 디버깅에서 객체를 더 명확하게 식별할 수 있도록 도와주는 중요한 메서드입니다.


프로젝트 개요

  • 사용자 정보를 담는 User 모델
  • 사용자 글을 나타내는 Post 모델
  • 글에 첨부된 이미지를 관리하는 PostImage 모델

모델 클래스 및 str 정의 예시

# member/models.py
class User:
    def __str__(self):
        return self.nickname

# post/models.py
class Post(TimestampModel):
    content = models.TextField('본문')
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f'[{self.user}] post'

class PostImage(TimestampModel):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    image = models.ImageField('이미지', upload_to='post/%Y/%m/%d')

    def __str__(self):
        return f'{self.post} image'

str() 호출 흐름 예시

모델 객체 반환 문자열 호출 흐름

User 상빈이 self.nickname
Post [상빈이] post f'[{self.user}] post' → User.__str__()
PostImage [상빈이] post image f'{self.post} image' → Post.__str__() → User.__str__()

예시 데이터 생성 및 출력 결과

user = User.objects.create(nickname="상빈이")
post = Post.objects.create(user=user, content="오늘의 일기")
image = PostImage.objects.create(post=post, image='example.jpg')

print(user)   # 상빈이
print(post)   # [상빈이] post
print(image)  # [상빈이] post image

💡 실무 팁

  • __str__()을 잘 정의해두면 admin 페이지나 디버깅 시 객체를 직관적으로 확인할 수 있어 편리합니다.
  • 정의하지 않으면 Post object (1)처럼 출력되어 관리하기 불편합니다.
  • 너무 많은 연쇄 참조를 하면 성능 저하가 발생할 수 있으므로 주의가 필요합니다.

✅ 마무리

  • __str__() 메서드는 모델 객체가 어떻게 보일지를 결정하는 중요한 요소입니다.
  • 연결된 객체가 있을 경우, 그 객체의 __str__()이 함께 호출되어 최종 문자열이 구성됩니다.

다음 단계로는 admin.py 파일에서 list_display, search_fields 등과 함께 __str__() 활용 방법을 이어서 학습해보세요!