2012-03-16 24 views
1

1人が数字を考え、別の人がそれを推測しなければならない数の推測ゲームを想像してみてください。正しい数が推測された場合、ゲームは終了します。Djangoクエリ集約

モデルは4回を果たした後、この

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 

を、しかしこれは可能ではないようです。 アイデア

答えて

0

あなたはジャンゴ(代わりにクラスのすなわちモデル)を使用している場合は、例えばQuerySet aggregate functions

を使用したいです

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

これにより、秘密番号とカウント値を持つオブジェクトのリストを含むクエリーセットが得られます。

+0

はい、私はDjangoを使用しており、モデルです。 あなたのクエリは、各秘密番号に対する推測の数に注釈を付けることに同意しますか?このような: ' [ { 'secretnumber__count':3 'secretnumber':1}、 { 'secretnumber__count':3 'secretnumber':2}、 { 'secretnumber__count':2 'secretnumber': 3}、 {'secretnumber__count':4、 'secretnumber':4} この結果を集計すると、1つの推測、 ...、n推測する。 – mbaechtold

+0

ああ、申し訳ありませんが、私は質問を誤解しました。私はテストすることはできませんが、最後に2番目の集計を追加するだけです:推測=オブジェクト。値( 'secretnumber' Count( 'secretnumber__count')) – meepmeep

+0

クエリがエラーをスローします... FieldError:キーワード 'count'をフィールドに解決できません。 – mbaechtold