2011-12-07 5 views
0

は私がグループにユーザーによるすべてのエントリを必要とし、このような何かをやって、カウントを取得するには、オブジェクトを配置したい場所をGROUP BYは、DjangoのORMを仕事を得ることができます同じユーザーを複数回また、私はStackOverflowの周りを見た後、以下を試してみた、そしてそれは私が欲しいもの以外の何かやっているように見える:は、どのように私はすべてのフィールドと

promotion.entry_set.annotate(Count('user')).order_by('user')[:10] 
promotion.entry_set.all().values('user').annotate(entry_count=Count('user')).order_by() 
Entry.objects.filter(promotion=promotion).annotate(Count('user')).order_by('user') 

は基本的に私は私の各ユーザーのEntryオブジェクトを与え、これをやろうとしているが。

Entry.objects.raw(""" 
    SELECT * 
    FROM promotion_entry 
    WHERE promotion_id = %s 
    GROUP BY user_id""", (promotion_id,)) 

次に、エントリカウントを取得するために2番目のクエリを実行しますが、これはまだ理想的ではありません。未処理のままでGROUP BYを実行できますか?

私はDISTINCT ONを可能にすることによって、バグトラッカーに将来的には私が欲しいものの上にやらせるだろうチケットがあるように思える:あなたは、各ユーザーの使用のためのエントリをカウントしたい場合はhttps://code.djangoproject.com/ticket/6422

答えて

0

promotion.entry_set.all().values('user').annotate(entry_count=Count('id')).order_by() 

各ユーザーの使用のためのいくつかのエントリしたい場合:

promotion.entry_set.all().values('user').annotate(entry_id=Max('id')).order_by() 

これはあなたのエントリのid年代を与えるが、を使用しますオブジェクト自体を取得するにはを使用します。

+0

それは私が欲しいものをしていません。これは、 'SELECT user_id、COUNT(*)from giveaways_entry WHERE promotion_id = 57 GROUP BY user_id; 'と同等です。 –

+0

@KitSundeそして何を得たいですか?各ユーザーのすべてのエントリまたは各ユーザーのエントリ数2番目の場合 - 私の答えを見てください。最初の場合は 'GROUP BY'で終わらないでしょう(' order_by' + 'itertools.regroup'はそのトリックを行います)。 – DrTyrsa

+0

私はちょっとあいまいでしたが、私は同意します。私は1つのEntryオブジェクトを各ユーザーに持たせたいが、複数のEntryオブジェクトは持たない。私はモデルの一部ではないので、カウントを別々に処理します.Djangoが追加するだけではないようです。 itertools.regroupは一致するすべての行を繰り返し処理しませんか?これは私が避けようとしてきたものです。以前はall()を実行し、既に見たユーザーを除外したクエリーセットを反復しましたが、ページ分割を行いたいので、クエリセットがかなり大きくなる可能性があります。 –

関連する問題