6

(私はpythonとdjangoを初めて使用するので、しばらくお待ちください。これが他の場所で回答されていて、見つからなかった場合はお詫びします)

リンク モデルがあり、django-voting アプリケーションを介してユーザーがリンク インスタンスに投票できるとします。スコアに従ってこれらのリンク インスタンスを順序付けるにはどうすればよいですか。スコアの高いものを最初に表示します。

django-voting の get_top マネージャーを使用できると思いますが、それは最高スコアのリンク インスタンスのみを提供し、追加したい他のパラメーター (たとえば、特定のユーザーに属するリンク) を考慮しません。またはページングなど)。

私の推測では、各アイテムのスコアに従ってクエリセットをフィルター処理できるリンク モデル用のカスタム マネージャーを作成することになるでしょう。各項目をループする必要があることを正しく理解していれば、そのスコアを確認してから、各項目のスコアに従ってソートされるリスト (または辞書) に配置します。それはクエリセットではなく、各アイテムの辞書を返します。

ここで何か不足していますか?

編集:

以下は、Link モデルの簡素化されたバージョンです。

class Link(models.Model):
    user = models.ForeignKey('auth.User')
    category = models.ForeignKey(Category)  
    date = models.DateTimeField( auto_now_add=True, null=True, blank=True )
    is_deleted = models.BooleanField(default=False, blank=True)
    links = ValidLinkManager()
    objects = models.Manager()

ユーザーが投票すると、次のように表示されます。

Vote.objects.record_vote(link, user, vote)

ここで、link は Link インスタンス、user は auth.User のインスタンス、vote は 1、0、または -1 のいずれかです。ValidLinkManager は、is_deleted が True に設定されているリンクを除外するだけです。

4

2 に答える 2

1

VoteManagerのget_topメソッドはそれほど複雑ではありません。そのコードを見てください (managers.py:122 内)。158行目で、フィルターを別のパラメーターとして受け入れ、作成後に「オブジェクト」クエリセットに適用するバージョンを簡単に作成できます。この方法で、欠落しているフィルターなどの他のフィルターを追加できます。

たぶん、それをパッチとしてジョナサンに提供することもできます。そうすれば、彼はそれを django-voting に入れるでしょう:)

于 2010-05-17T21:21:06.437 に答える
0

モデルで一般的なリレーションを使用することにしました。

votes = generic.GenericRelation(Vote)

それを集約するには:

my_model.objects.annotate(num_votes=Count('votes'))

この場合、オブジェクトが受け取った投票数をカウントしているだけですが、 で切り替えCountAvg平均を取得できます。

Django ではデフォルトでは動かないのでインストールしdjango-generic-aggregationました。

于 2012-07-05T15:43:28.630 に答える