0

私のモデルは次のようになります。

class UserRating(models.Model):

    RATING_CATEGORIES = (
        1: 'Bad',
        2: 'Boring',
        3: 'Average',
        4: 'Good',
        5: 'Great'
    )

    for_user = models.ForeignKey(User, related_name='for_user')
    by_user = models.ForeignKey(User, related_name='by_user')
    rating_category = models.IntegerField(choices=RATING_CATEGORIES)
    points = models.IntegerField(_('Points'), default=0)
    created = models.DateTimeField(_('Created'))

今、私は評価さrating_categoryれたものに従って、最新の5行を選択したいと思います。by_userfor_user

私はこのようなことをしました:

entries = UserRating.objects.values('rating_category').filter(
        for_user=for_user,
        by_user=by_user).order_by('-created')[:5]

しかし、に基づいて重複した行を返しますrating_category

次のMySQLテーブルエントリがあると仮定しましょう:

id for_user by_user rating_category points         created
 1    1        1           1          100     2012-09-28 00:19:00
 2    1        1           2          100     2012-09-28 00:18:00
 3    1        1           4          100     2012-09-28 00:17:00
 4    1        1           4           0      2012-09-28 00:16:00
 5    1        1           3          100     2012-09-28 00:15:00
 6    1        1           5           0      2012-09-27 00:19:00
 7    1        1           2           0      2012-09-26 00:18:00

望ましい出力は次のとおりです。 rowid-1, rowid-2, rowid-3, rowid-5, rowid-6

日付に基づいた個別の行rating_categoryのみ。latestcreated

4

1 に答える 1

2

DISTINCTここでは赤いニシンです。やりたいことは、レコードをグループ化してからrating_category、各グループについて、作成日が最も新しいものを選択することです。したがって、次のようなクエリが必要です。

from django.db.models import Max
entries = (UserRating.objects.filter(for_user = for_user, by_user = by_user)
           .values('rating_category')
           .annotate(last_created = Max('created'))
           .order_by('-last_created'))[:5]

rating_categoryこれは、キーとを持つ辞書を返しますlast_created

于 2012-10-02T09:58:53.433 に答える