1

list_items在 django admin 中定义了一个函数,如下所示:

def won(self):
    result = (Result.objects.filter(user=self)
              .select_related('user')
              .aggregate(Sum('prize'))['prize__sum'])
    return result if result else 0

结果包含用户的外键以及“奖品”,定义了用户获得的积分数量。

使用 Django 调试工具栏,我发现列出的每个用户都会运行 40 个相同的查询来计算每个用户的“赢”值。

SELECT SUM("games_result"."prize") AS "prize__sum" FROM "games_result" WHERE "games_result"."user_id" = 28297
Duplicated 40 times. 

我是否在做一些明显错误的事情来导致这个问题?有没有更好的方法来获取带有指向该用户的链接的 Result 对象?

4

1 回答 1

3

考虑到您的用户有一个名为 的字段results,它代表某个用户的所有游戏结果,您可以使用注释聚合函数为每个用户添加一个字段,然后在每个用户上您可以简单地选择 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'))
于 2015-08-25T22:26:20.503 回答