2017-01-12 6 views
1

私は現在、公式チュートリアルを通してDjangoについて学んでおり、hereのような追加機能とテストを追加しようと決めました。PostgreSQLデータベース(Djangoとの関係)には、関係があるオブジェクトのみの問い合わせ

私は今、DBに二つのモデルを持っているが、このように基本的に見て:

class Question(models.Model): 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 

私が質問のリストを表示するように設定ビューを持っています。私がしたいのは、関連する選択肢を持つ質問オブジェクトのみを含むビューのクエリを作成することです。関連する選択肢オブジェクトを持たない質問オブジェクトは、結果セットに含めるべきではありません。このクエリでは、将来の日付の質問は無視され、並べ替えられますが、その部分はチュートリアルの外にあります。

これまで私が思いついたのはこれです。それはうまくいくと思われますが、私は本当に後方に非効率な方法でそれをやったと思うのを助けることができません。 2つのクエリとリストの理解の代わりに、データベース内のすべてを処理する1つのクエリを作成することは可能ですか?

choices = Choice.objects.prefetch_related(
    'question').distinct('question') 
question_ids = [x.question.id for x in choices] 
return Question.objects.filter(
    id__in=question_ids).filter(
    pub_date__lte=timezone.now()).order_by('-pub_date')[:5] 

答えて

1

あなたはそれが関連付けられているChoiceオブジェクトの数によってQuestionクエリセットに注釈を付けた後、ゼロカウントとするものを除外することができます。

from django.db.models import Count 
questions = Question.objects \ 
     .annotate(choice_cnt=Count('choice')) \ 
     .exclude(choice_cnt=0) \ 
     .filter(pub_date__lte=timezone.now()) \ 
     .order_by('-pub_date')[:5] 
素晴らしい作品
+1

!迅速な回答と改良された書式設定に感謝します。 – coralvanda

+0

私は助けてうれしいです。 – AKS

関連する問題