아래와 같은 모델이 있을 때 수업생성을 누가 했는지 어드민에서 출력하고자 한다.
class Session(models.Model):
title = models.CharField()
date = models.DatetimeField()
created_by = models.ForeignKey(User)
...
class User(models.Model):
is_teacher = models.BooleanField()
...
def __str__(self):
if self.is_teacher:
return f'{self.name} 선생님'
return f'{self.phone_number} 님 ({self.name})'
class Teacher(models.Model):
user = models.ForeignKey(User)
...
admin의 list_display로 보여질 속성을 아래와 같이 선언해주었다.
class SessionAdmin(admin.ModelAdmin):
list_display = ["title", "date", ..., "created_by"]
장고 어드민에서 연관된(참조된) 모델의 __str__을 참고해서 보여주기 때문에 위와같이 했을 때 created_by에 참조되고 있는 User의 __str__에서 Teacher모델까지 들어가게 되어 불필요한 쿼리가 발생되고 있었다.
그럼 __str__만 수정하면 될 것 같은데?
그래서 어드민에서만 __str__메소드를 override해주었다.
# User/admin
class UserAdmin(BaseUserAdmin):
...
def override_str(self):
return f"{self.phone_number} ({self.name})"
User.add_to_class("__str__", override_str)