본문으로 바로가기

해당 모델의 정보를 가져와서 평균을 내는 간단한 로직을 짰습니다.

결국, models.py에서도 로직을 짤 수 있다는 것입니다.

 

admin 쪽의 코드를 깔끔하게 유지할 수 있고, 해당 모듈을 여러 곳에서 import해서 해당 함수의 결과값을 다양한 곳에 활용할 수 있다는 장점이 있습니다.

 

뿐만 아니라 일반적으로, 프론트 엔드를 통해 엔드유저도 사용하는 로직은 Model에서 짜고, 어드민만 보는 로직은 Admin.py에서 짭니다.

from django.db import models
from core import models as core_models

class Review(core_models.TimeStampedModel):

    """Review Model Definition"""

    review = models.TextField()

    accuracy = models.IntegerField()
    communication = models.IntegerField()
    cleanliness = models.IntegerField()
    location = models.IntegerField()
    check_in = models.IntegerField()
    value = models.IntegerField()

    user = models.ForeignKey(
        "users.User", related_name="reviews", on_delete=models.CASCADE)
    room = models.ForeignKey(
        "rooms.Room", related_name="reviews", on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.review} - {self.room}"

    # 함수 정의. 이후 model import해서 여러 곳에서 재활용 ㄱㄱ
    def rating_averge(self):
        avg = (
            self.accuracy +
            self.communication +
            self.cleanliness +
            self.location +
            self.check_in +
            self.value
        ) / 6

        return round(avg, 2)
    rating_averge.short_description = "Avg"

 

함수의 결과값을 어드민 패널에 list_display로 등록해서 표현해보았습니다.

from django.contrib import admin
from . import models

# Register your models here.
@admin.register(models.Review)
class ReviewAdmin(admin.ModelAdmin):

    """Review Admin Definition"""

    list_display = ('__str__', 'rating_averge',)

    pass

 

 

한편, 위 Review 모델을 보면, room 어플의 Room 모델과 FK 관계에 있음을 알 수 있습니다.

# Review Model

room = models.ForeignKey(
  "rooms.Room", related_name="reviews", on_delete=models.CASCADE)

이 말은, 하나의 Room이 여러 개의 Review를 가지고 있다는 것입니다. 따라서, Room 모델에서 리뷰를 가져와서 활용할 수 있습니다. (related_name이 reviews이므로 reviews라는 이름으로 가능하다)

 

하나의 Room이 가진 여러 개의 Review의 점수를 모두 모아 평균을 낸 후 Room 어드민 패널에 표시해보겠습니다.

class Room(core_models.TimeStampedModel):

    """Room Model Definition"""

    ... (중략)

    def __str__(self):
        return self.name

    def total_ratings(self):
        all_reviews = self.reviews.all()
        all_ratings = 0
        for review in all_reviews:
            all_ratings += review.rating_averge()
        return round(all_ratings / len(all_reviews), 2)

 

해당 함수 admin.py의 list_display에 넣어주면 어드민 패널에 반영됩니다.

 


 

프론트 엔드를 통해 엔드유저도 사용하는 로직은 Model에서 짜고, 어드민만 보는 로직은 Admin.py에서 짭니다.

 

 

@admin.register(models.Photo)
class PhotoAdmin(admin.ModelAdmin):

    """ Photo Admin Definition """

    list_display = (
        "__str__", "get_thumbnail"
    )

    def get_thumbnail(self, obj):
        print(dir(obj.file))
        print((obj.file.path))
        print((obj.file.name))
        print((obj.file.size))
        return obj.file.url
    get_thumbnail.short_description = "Thumbnail"

    pass

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체