해당 모델의 정보를 가져와서 평균을 내는 간단한 로직을 짰습니다.
결국, 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
'Django, Flask > 🔫 Django' 카테고리의 다른 글
어드민 패널 개선하기: raw_id_field, inline admin (0) | 2020.05.13 |
---|---|
업로드 다루기: Meida와 static의 차이, mark_safe (0) | 2020.05.13 |
QuerySet 활용하기, related_name (0) | 2020.05.12 |
Admin panel Customizing (further) (0) | 2020.05.12 |
ForeignKey, ManyToManyField로 모델 연결하기 (0) | 2020.05.12 |