1

コメント数のあるデータベースからエントリを取得する必要があります。djangoのコメントフレームワークでそれを行うことはできますか?GenericForeignKeysを使用していない投票アプリケーションも使用しています。次のようなスコアのエントリを取得します。

class EntryManager(models.ModelManager):
    def get_queryset(self):
        return super(EntryManager,self).get_queryset(self).all().annotate(\
            score=Sum("linkvote__value"))

しかし、外国の鍵があるとき、私は立ち往生しています。それについて何かアイデアはありますか?

追加の説明:次のようなエントリをフェッチする必要があります:

id | body | vote_score | comment_score |
 1 |  foo |         13 |             4 |
 2 |  bar |          4 |             1 |

その後、comment_scoreで注文できます。:)

すべての返信に感謝します。

4

1 に答える 1

1

どうやら、逆の一般的な関係(または一般的には追加のフィルター)で注釈を付けることはまだオープンチケットです(対応するドキュメントも参照してください)。extraこれが解決されるまで、次のようにクエリで生のSQLを使用することをお勧めします。

return super(EntryManager,self).get_queryset(self).all().annotate(\
    vote_score=Sum("linkvote__value")).extra(select={
        'comment_score': """SELECT COUNT(*) FROM comments_comment
            WHERE comments_comment.object_pk = yourapp_entry.id
            AND comments_comment.content_type = %s"""
    }, select_params=(entry_type,))

もちろん、正しいテーブル名を入力する必要があります。さらに、entry_typeルックアップ関数の外部で設定できる「定数」です(ContentTypeManagerを参照)。

from django.contrib.contenttypes.models import ContentType
entry_type = ContentType.objects.get_for_model(Entry)

Entryこれは、スコアを計算するモデルが1つあることを前提としています。そうしないと、状況が少し複雑になります。各注釈付きオブジェクトのタイプのコンテンツタイプIDをフェッチするには、サブクエリが必要になります。

于 2011-12-14T20:57:30.677 に答える