What I am trying to do:
我试图使自定义过滤器在Django管理使用SimpleFilter
在list_filter
中使用.
What I tried:
下面是我在admin.py
文件中写下的代码.
我使用SimpleFilter
来创建名为RoomScoreFilter
的自定义过滤器.
RoomScoreFilter
进行筛选,如果平均分数在1.00
到1.99
之间,则会筛选为Very poor
,依此类推.
class RoomScoreFilter(admin.SimpleListFilter):
title = _("Room Score")
parameter_name = "score"
def lookups(self, request, model_admin):
return [
("1", _("Very poor")),
("2", _("Poor")),
("3", _("Normal")),
("4", _("Good")),
("5", _("Excellent")),
]
def queryset(self, request, queryset):
if self.value() == "1":
return queryset.filter(get_average_rating__gte=1, get_average_rating__lt=2)
@admin.register(Review)
class ReviewAdmin(admin.ModelAdmin):
empty_value_display = "-----"
fieldsets = [
("Room & Customer", {"fields": ["room", "customer"]}),
(
"Evaluation",
{"fields": ["get_average_rating", "comment"], "classes": "wide"},
),
(
"Individual Scores",
{
"fields": [
"cleanliness",
"accuracy",
"location",
"communication",
"check_in",
"value",
]
},
),
]
list_display = (
"room",
"customer",
"cleanliness",
"accuracy",
"location",
"communication",
"check_in",
"value",
"get_average_rating",
"comment",
)
list_display_links = ("room",)
list_per_page = 20
list_filter = [RoomScoreFilter]
search_fields = ("room", "user")
search_help_text = _("Searchable by room name and user ID.")
readonly_fields = ("room", "customer", "comment", "get_average_rating")
下面是我的模特.
class Review(CommonDateTimeModel):
"""Review model Definition"""
cleanliness = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1), MaxValueValidator(5)],
verbose_name=_("Cleanliness"),
help_text=_("How clean a room was."),
)
accuracy = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1), MaxValueValidator(5)],
verbose_name=_("Accuracy"),
help_text=_("How much did host provide accurate information about room."),
)
location = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1), MaxValueValidator(5)],
verbose_name=_("Location"),
help_text=_("Was location good or fair enough to reach out?"),
)
communication = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1), MaxValueValidator(5)],
verbose_name=_("Communication"),
help_text=_("How well did room host communicate with customers?"),
)
check_in = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1), MaxValueValidator(5)],
verbose_name=_("Check In"),
help_text=_("How easy was it for checking in?"),
)
value = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1), MaxValueValidator(5)],
verbose_name=_("Value"),
help_text=_("Was it valuable enough compared to the price per night?"),
)
room = models.ForeignKey(
"rooms.Room",
on_delete=models.DO_NOTHING,
related_name="reviews",
verbose_name=_("Room"),
)
customer = models.ForeignKey(
"users.User",
on_delete=models.DO_NOTHING,
related_name="reviews",
verbose_name=_("Customer"),
)
comment = models.TextField(verbose_name=_("Comment"), null=True, blank=True)
def get_average_rating(self):
total_scores = (
self.cleanliness
+ self.accuracy
+ self.location
+ self.communication
+ self.check_in
+ self.value
)
average_score = round(total_scores / 6, 2)
return average_score
get_average_rating.short_description = _("Total Rating")
def __str__(self):
return str(f"{self.customer}'s review on {self.room}")
所以基本上get_average_rating()
方法所做的是简单地将我写下的所有6个字段(cleanliness
、check_in
等)相加,然后除以6,四舍五入到2位.
The error that I got:
然而,它却抛出了我可能预料到的错误:
Cannot resolve keyword 'get_average_rating' into field. Choices are: accuracy, check_in, cleanliness, comment, communication, created_at, customer, customer_id, id, location, room, room_id, updated_at, value
有什么办法可以解决这个问题吗?