我在django admin的list_items
中定义了一个函数,如下所示:
def won(self):
result = (Result.objects.filter(user=self)
.select_related('user')
.aggregate(Sum('prize'))['prize__sum'])
return result if result else 0
结果包含user的外键,以及定义用户获得的点数的"奖品"。
使用Django调试工具栏,我发现每个用户被列出的结果是40个相同的查询正在运行,以计算每个用户的'won'值。
SELECT SUM("games_result"."prize") AS "prize__sum" FROM "games_result" WHERE "games_result"."user_id" = 28297
Duplicated 40 times.
我做了什么非常明显的错误导致这个问题吗?是否有更好的方法来获取带有此用户链接的Result对象?
考虑到您的用户有一个名为results
的字段,它表示某个用户的所有游戏结果,您可以使用annotation聚合函数为每个用户添加一个字段,然后在每个用户上您可以简单地选择prize_sum,如下例所示:
class UserAdmin(admin.ModelAdmin):
list_display = ('won', )
def won(self):
return self.prize_sum
def get_queryset(self, request):
return super(UserAdmin, self).get_queryset(
request).select_related('results').annotate(prize_sum=Sum('results__prize'))