1

私は、ユーザーがお互いに与えるカルマを追跡するアプリケーションを構築しています。私は、7日間のローリング期間でリーダーボードを作成し、7日間のローリング期間で最も多くのカルマを与えた人々のリストを作成できるようにしたいと考えています。私は次のモデルを思いついた:

class KarmaAction(models.Model):
    user = models.ForeignKey(User)
    sender = models.ForeignKey(User)
    karma = models.IntegerField()
    created_at = models.IntegerField()

まず、ユーザー数が増えるにつれて、上記のモデルはうまくスケーリングしますか?7日以上経過している行を削除することを考えています。次に、過去数日間に与えられたカルマの対応する合計を使用して送信者のリストを作成する方法を知りたいです。多分それはこのように見えるでしょう:

supporters = {'User 1': 14, 'User 2': 12, 'User 3': 7, 'User 4': 2}

Django ORMでこれを行う方法はありますか?

4

1 に答える 1

1

モデルは私には合理的なようです。私はそれを行う別の方法を本当に見ていません。とにかく、要件を満たすには、そこにあるすべての情報が必要です。(created_atおそらくDateTimeField?)それが遅すぎる場合は、おそらくアグレッシブなキャッシングを追加する必要があります。

あなたは次のようなことをすることができます(テストされていませんが、私はそれがうまくいくはずだと思います)

TIME_RANGE = datetime.timedelta(days=7)
now = datetime.datetime.now()

KarmaAction.objects.filter(created_at__gte=now - TIME_RANGE) \
                   .filter(user=recepient_user) \
                   .values('sender') \
                   .annotate(total_sent=Sum('karma')) \
                   .order_by('total_sent')

これは、を使用しvaluesて一意のsでグループ化し、それらの値senderを合計しkarmaます。

order_byデフォルトの順序がある場合、それがクリアされ、グループ化に干渉しないことを確認するためにを追加しました。また、たとえば最後にnegを追加するだけで、カルマの上位の送信者を簡単に取得できます。もちろん、それを作成した場合は:)。[:5]-total_sent

私はこの問題の原因ではないと思いますが、filterテストなしではポジティブではありません。

于 2012-04-19T04:42:38.420 に答える