【发布时间】:2014-05-17 14:24:29
【问题描述】:
我遇到了一个问题,我想根据管理员中相关字段的聚合进行排序,但不确定最佳解决方法。这是我的模型:
# models.py
from django.db import models
class Waiter(models.Model):
pass
class Customer(models.Model):
pass
class Meal(models.Model):
BREAKFAST = 1
LUNCH = 2
DINNER = 3
MEAL_TYPE_CHOICES = (
(BREAKFAST, 'Breakfast'),
(LUNCH, 'Lunch'),
(DINNER, 'Dinner'),
)
meal_type = models.IntegerField(choices=MEAL_TYPE_CHOICES)
customer = models.ForeignKey(Customer)
waiter = models.ForeignKey(Waiter)
service_rating = models.IntegerField()
在服务员管理中,我想显示早餐、午餐和晚餐每个服务员的平均服务评分,并希望能够按每个服务员作为单独的列进行订购。
This question 解释了如何按每位服务员的所有服务评分的平均值进行订购(代码如下),但我真的很想按每种餐食类型的相应服务评分进行订购。最好的方法是什么?
# admin.py
from .models import Customer, Meal, Waiter
from django.contrib import admin
from django.db.models import Avg
class WaiterAdmin(admin.ModelAdmin):
list_display('avg_breakfast_rating', 'avg_lunch_rating', 'avg_dinner_rating')
def queryset(self, request):
qs = super(WaiterAdmin, self).queryset(request)
qs = qs.annotate(Avg('meal__service_rating'))
return qs
def avg_breakfast_rating(self, obj):
breakfasts = Meal.objects.filter(waiter=obj, meal_type=Meal.BREAKFAST)
return breakfasts.aggregate(avg_rating=Avg('service_rating'))['avg_rating']
avg_breakfast_rating.short_description = 'Average Breakfast Rating'
avg_breakfast_rating.admin_order_field = 'meal__service_rating__avg'
def avg_lunch_rating(self, obj):
lunches = Meal.objects.filter(waiter=obj, meal_type=Meal.LUNCH)
return lunches.aggregate(avg_rating=Avg('service_rating'))['avg_rating']
avg_lunch_rating.short_description = 'Average Lunch Rating'
avg_lunch_rating.admin_order_field = 'meal__service_rating__avg'
def avg_dinner_rating(self, obj):
dinners = Meal.objects.filter(waiter=obj, meal_type=Meal.DINNER)
return dinners.aggregate(avg_rating=Avg('service_rating'))['avg_rating']
avg_dinner_rating.short_description = 'Average Dinner Rating'
avg_dinner_rating.admin_order_field = 'meal__service_rating__avg'
基本上,我不想让 admin_order_field 成为 meal__service_rating__avg,而是希望有类似 breakfast__service_rating__avg、lunch__service_rating__avg 和 dinner__service_rating__avg 的东西来订购。
【问题讨论】:
标签: django django-admin