Агрегация запросов Django - PullRequest
1 голос
/ 16 марта 2012

Представьте себе игру в угадывание чисел, в которой один человек думает о числе, а другой должен его угадать.Игра заканчивается, если угадано правильное число.

Модели могут выглядеть следующим образом

class SecretNumber(models.Model):
    number = models.IntegerField()

class Guess(models.Model)
    secretnumber = models.Foreignkey(SecretNumber)
    guess = models.IntegerField()

После четырехкратного воспроизведения база данных может выглядеть следующим образом:

id  number  
==========
1   10
2   54
3   68
4   25

id  secretnumber_id     guess
=============================
1   1                   50
2   1                   30
3   1                   10
4   2                   99
5   2                   60
6   2                   54
7   3                   1
8   3                   68
9   4                   73
10  4                   34
11  4                   86
12  4                   51
13  4                   25

Как видите, догадчику очень повезло: ему потребовалось 3, 3, 2 и 4 догадки.Но это только для того, чтобы этот пример был коротким.Теперь мне нужно составить запрос, который позволит отобразить следующие данные:

Nb. guesses     Count   
=====================
2               1
3               2
4               1

Ручная инструкция SQL будет выглядеть примерно так:

SELECT inner_count AS 'Nb. guesses', count(inner_count) AS 'Count' FROM (
  SELECT secretnumber_id, count(id) AS inner_count FROM guess GROUP BY secretnumber_id
) GROUP BY inner_count

Я думал об аннотированиианнотации, но это кажется невозможным.Есть идеи?

1 Ответ

0 голосов
/ 16 марта 2012

Если вы используете django (то есть модели вместо классов), вы хотите использовать агрегатные функции QuerySet

, например

from django.db.models import Count
guesses = Guess.objects.values('secretnumber').annotate(Count('secretnumber'))

Это даст вам набор запросов со списком объектов, которые имеют секретный номер и значение счетчика.

...