Django admin - override model method

Nam Eun-Ji·2022년 4월 21일

참고 stackoverflow

상황

아래와 같은 모델이 있을 때 수업생성을 누가 했는지 어드민에서 출력하고자 한다.

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)
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글