2016-06-13 3 views
0

私はあなたにランダムなジョークを与えるサイトを持っていますが、問題は同じジョークをあまりにも頻繁に表示することがあることです。私はジョークモデルを持っていて、これらのジョークのIDを保存したいと思います。そして、すべての訪問者は同じ冗談が表示されないようにします。言い換えれば、20ラウンドです。しかし、どうすればそのようなデータを保存して、それらを渡すことができますか?私はすでに示したジョークのIDを保存し、(ランダム適切なジョークをジョーク格付けを取得して返すfind_joke関数から与えられた、)新しいIDをチェックする必要があり、今Python-Django:表示されたアイテムを再度表示しないように保存しますか?

def random_good_joke_page(request): 
    """If asked for a random joke, redirect to joke's page.""" 
    return redirect('/jokes/%d/' % Joke.find_joke("Hot").id) 


def random_cold_joke_page(request): 
    """If asked for a random joke, redirect to joke's page.""" 
    return redirect('/jokes/%d/' % Joke.find_joke("Cold").id) 

: はここに私の見解ですそのジョークが最近表示された場合は、まだ表示されていないIDが見つかるまで、新しいIDを選択します。これらのデータを保存してDjangoに渡すにはどうすればいいですか?私はクッキーを考えました。あるいは、ジョークモデルにそのような機能を追加することもできます(しかし、私はそれが各訪問者には当てはまらないと思っていますが...そのような状況のためのいくつかのデフォルトの実用的な方法はありますか?ありがとう

答えて

2

あなたは、ユーザーのセッションでジョークを格納することができ:

seen_joke_ids = request.session.get('seen_joke_ids', []) 
joke = Joke.objects.exclude(pk__in=seen_joke_ids).order_by('?')[0] 
seen_joke_ids.append(joke.pk) 
request.session['seen_joke_ids'] = seen_joke_ids[-20:] 

# your logic to display/redirect 
return redirect(reverse('joke', args=[joke.pk])) 
+0

ただ一つのこと:どのように私は除外して、別の条件を追加することができますか?私はちょうどレーティング= "コールド"ではなく、レーティング= "ホット"でジョークを取得したい。それを除いて、ありがとう、私は今、そのようなものはありませんでした... – Antoni4040

+1

クエリーセットをチェーンしてください: 'qs = Joke.objects.exclude(pk__in = seen_joke_ids).filter(rating = 'hot')' または: 'qs = qs.filter(rating_in = ['hot'、 'semi_hot'])など。 – ohrstrom

+0

ええ、わかった...ありがとう、素晴らしい作品! – Antoni4040

関連する問題