1

私は次のモデルを持っています

class Dishes(models.Model):
    name = models.CharField(max_length=40, unique=True)
    date_added = models.DateTimeField(auto_now_add=True)
    #increment/decrement with upvote added or removed
    count_votes = models.IntegerField(blank=True, null=True, default=0)

class Upvotes(models.Model):
    dish = models.ForeignKey(Dishes)
    user = models.ForeignKey(User)
    date_added = models.DateTimeField(auto_now_add=True)

最初の 2 つは date_added と count_votes によるもので、dish.order_by('-count_votes') と dish.order_by('-date_added') で簡単に実装できます。3 番目のソートは「トレンド ソート」です。 「これは基本的に、時間の経過に伴う賛成票の関数として料理をランク付けするようなものになりたいのですが、どうすればこれを行うことができるでしょうか?

4

1 に答える 1

1

「トレンド」アルゴリズムの実装を検討しているようです。

この件に関する記事はたくさんありますが、これについて尋ねるのはあなたが初めてではありません。thisthisをチェックして、事前に構築されたパッケージの使用を確実に検討してください。役に立つかもしれないdjango -trendingdjango-votingを見つけました。

編集

Django では annotate を使用して複雑な順序付けを行うことができますが、それは Avg や Sum などの組み込みの集計関数に限定されています (方法については、こちらを参照してください)。そのため、カスタム メソッドを使用して注文する django 固有の方法はありません。

ただし、それは Python でできないという意味ではありません。

sorted(Dishes.objects.all(), key=lambda x: x.trending_method())

大規模なデータベースでどのように機能するかはわかりませんが、これは生の SQL を使用する以外に私が知っている唯一の方法です (これもオプションですが、面倒な解決策です)。それが役立つことを願っています!

于 2013-09-30T09:57:55.653 に答える