2

各ユーザーのページ要求で計算された統計データをクエリセットに追加して、大きなテーブルに表示したいと考えています。注釈メソッドが最良の選択かもしれませんが、テンプレートでの操作を容易にするために、作成されたクエリセットを単一のクエリセットにマージすることに固執しています。クエリセット タイプは、データの並べ替えに適しています。

以下は、私のアプリケーションの非常に単純化された原則です。テンプレートとモデルには触れないでください。それは明らかに私が望んでいる結果だからです。この例では、列によるデータの並べ替えは実​​装されていません。

モデルは次のとおりです。

class Poll(models.Model):
    question = models.CharField(max_length=200, unique=True)

class Vote(models.Model):
    poll = models.ForeignKey(Poll)
    accept = models.BooleanField()
    comment = models.CharField(max_length=200, unique=True)
    censored = models.BooleanField()

ビューは次のとおりです。

def summaryView(request):
    …
    contexte['poll_list'] = «insert code here»
    …
    return render_to_response('summary.html, contexte)

テンプレートは次のとおりです。

<table>
  <thead>
    <tr>
      <th>
        Poll question
      </th>
      <th>
        Number of votes
      </th>
      <th>
        Number of uncensored "yes" votes
      </th>
      <th>
        Number of censored votes
      </th>
    </th>
  </thead>
  <tbody>
    {% for poll in poll_list %}
      <tr>
        <td>
          {{ poll.question }}
        </td>
        <td>
          {{ poll.numUncensoredYesVotes }}
        </td>
        <td>
          {{ poll.numCensoredVotes }}
        </td>
      </tr>
    {% endfor %}
  </tbody>
</table>

難しいのは、無修正の「はい」投票数のアノテーションを作成することです。Count() 集計関数はフィルターを受け入れません。

4

2 に答える 2

0

Python ではいつでも 3 つのクエリでこれを行うことができます (Python でクエリセットを手動で結合するだけです) が、1 つのクエリで行う方法は次のとおりです。

contexte['poll_list'] = Poll.objects.raw(
    ' select A.*, B.numcensoredvotes, C.numuncensoredyesvotes from 
    ( query1 ) A left join (query2) B on A.id = B.poll_id
    left join (query3) C on A.id = C.poll_id' )

query2 と query3 は集計クエリです。次の方法でクエリセットのクエリにアクセスできます。

poll_list = Poll.objects.filter(...)
poll_list.query.get_initial_alias()
(query1,q1param) = poll_list.query.sql_with_params()

集計クエリ (上記のクエリ 2 とクエリ 3) に対してもこれを行うことができます。または、単に手動で記述することもできます。

重要なクエリセット アノテーションが実行される関連シナリオについては、http://www.reddit.com/r/django/comments/1dgz97/annotating_a_queryset_with_a_nontrivial_left/も参照してください。

于 2013-05-01T22:45:27.973 に答える