2017-12-28 46 views
0

これらの質問には質問とオプションが格納されている次のモデルがあるとします。Django集計:リレーショナルクエリーセットに関する集計

P.S:私はちょうどあなたにアイデアを与えるために基本的なコードを書いています。

class Question(models.Model): 
    text = models.CharField() 

class Option(models.Model): 
    text = models.CharField() 

class QuestionOption(models.Model): 
    question = models.ForeignKey(Question) 
    option = models.ForeignKey(Option) 

私はフィードバック調査の各質問に対してユーザーのフィードバックとオプションを選択したモデルを用意しています。

class Feedback(models.Model): 
    full_name = models.CharField() 
    cell_phone = models.CharField() 
    created_at = models.DateTime() 

class FeedbackOption(models.Model): 
    feedback = models.ForeignKey(Feedback, related_name='feedback_options') 
    option = models.ForeignKey(QuestionOption) 

すべてのフィードバックには、多くのフィードバックオプションオブジェクトがあります。今、私は、フィードバックオプションに特定のQuestionOptionオブジェクトが含まれているすべてのフィードバックをフィルタリングして、そのフィードバックのFeedbackOptionsオプションのテキストが 'boo' add countであるかどうかを確認しながら集約クエリを実行します。私はそれがオプションIDは、各フィードバックのフィードバックオプションの残りの1ではないだけで、フィードバックオプションに集計を適用しているように見え、1つのステップでこの

# lets say i want to filter all feedback with QuestionOption id 1 
stats = Feedback.objects.filter(feedback_options__option=1).aggregate(
    boo=Count(Case(When(feedback_options__option__option__text='boo', then=1))), 
    hoo=Count(Case(When(feedback_options__option__option__text='hoo', then=1)))) 

ような何かを行うことができます。

+0

あなたは*テキストごと、または唯一 ' 'boo''、そして'' hoo''のカウント*をしたいですか? –

+0

idのフィードバックオプションを含むフィードバックのすべてのフィードバックオプションをチェックし、テキストが 'boo'と 'hoo'のすべてのフィードバックオプションを数えようとしています –

+0

今は2つの方法でこれを達成しています異なる部分。 最初に、すべてのフィードバックをフィルタリングし、 'values_list( 'id'、flat = True)'を作成します。 2番目のフィードバックリストを使用して、私はすべてのフィードバックオプションをフィルタリングします。 'FeedbackOption.objects.filter(feedback__in = feedback_list) '集約クエリを適用します。 –

答えて

0

.filter()は、where句として機能します。結果のクエリーセットに.aggregate()のような別のメソッドを追加すると、同じwhere句でバインドされます。

ジャンゴ1.11で、あなたは同様にあなたがhooのために別の注釈を追加することができますSubquery

from django.db.models import OuterRef, Subquery, Count 

Feedback.objects.filter(feedback_options__option=o1).annotate(
    boo=Subquery(
     FeedbackOption.objects.filter(option__option__text="boo", feedback=OuterRef('pk')).values('feedback').annotate(count=Count('pk')).values('count'), 
     output_field=models.IntegerField()) 
    ) 

を使用することができます。

Doc reference