2016-07-20 13 views
1

私は現在、対応モデルReviewCommentを持つRestaurantモデルを持っています。ユーザーはレストランにコメントしてレビューすることができます。djangoのウェイトロジックを過去7日間で作成する

私は最大の重みを持つ上位3軒のレストランを表示するDjangoでウェイトロジックを作成しようとしています。

現在のロジックは次のようになります。過去7日間のみレビューやコメントは、重量に織り込まれるように

restaurants = Restaurant.objects.all() 
top_3 = restaurants.annotate(weight=(Count('review')) + F('views') + (Count('comment'))).order_by('-weight') 

どのように私はこのロジックを更新することができますか?私はこれが役立つことを願っています pub_date = models.DateTimeField(default=timezone.now, blank=True)

+0

'views'分野は何ですか:あなたはそれらのrestaurantsを気にしない場合は、このフィルタを使用することができます? –

+0

良い質問です。これはレストランモデル内のフィールドです。基本的に、レストランが受け取ったビューの総数を示す整数。これは実際には過去7日間に考慮する必要はありません。私は質問を更新します。 –

答えて

3

import datetime 

from django.db.models import Q 
from django.utils import timezone  

week_ago = timezone.now() - datetime.timedelta(days=7) 
top_3 = Restaurant.objects.filter(
    Q(review__isnull=True) | Q(review__pub_date__gt=week_ago), 
    Q(comment__isnull=True) | Q(comment__pub_date__gt=week_ago), 
).annotate(weight=...).order_by('-weight')[:3] 

review__isnull=Truecomment__isnull=Trueがないようにしている

編集 レビューやコメントモデルは、両方のオブジェクトが作成された追跡用のフィールドを持っていますrestaurantsを除外し、reviewsおよびcommentsを除いたものを除外します。

filter(review__pub_date__gt=week_ago, comment__pub_date__gt=week_ago) 

ドキュメント

+0

彼は過去7日間、今日だけではなく計算したいと考えています。だから私はそれがすべきだと思います: 'pub_date__gt = today - timedelta(days = 7)' – Todor

+0

@Todorありがとう!私は私の答えを編集します。 –

+0

私が修正しなければならなかったのは、 'from datetime import datetime、timedelta'' week_ago = datetime.now() - timedelta(days = 7) ' –

関連する問題