Администратор Django запускает запрос несколько раз

У меня есть функция, определенная в list_items в админке django выглядит следующим образом:

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

Результат содержит внешний ключ для пользователя, а также "приз", определяющий количество очков, заработанных пользователем.

Используя Django Debug Toolbar, я обнаружил, что каждый из перечисленных пользователей приводит к 40 одинаковым запросам, выполняемым для вычисления значения выигрыша для каждого пользователя.

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

Я делаю что-то действительно явно неправильно, чтобы вызвать эту проблему? Есть ли лучший способ получить объекты Result со ссылкой на этого пользователя?

1 ответ

Учитывая, что у вашего пользователя есть поле с именем results, который представляет все результаты игр для определенного пользователя, вы можете использовать функцию агрегирования аннотаций, чтобы добавить поле для каждого пользователя, а затем для каждого пользователя вы можете просто выбрать приз_сум, как в этом примере:

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'))
Другие вопросы по тегам