PostgreSQLデータベース(9.2.2)を使用してDjango1.4.3とPython2.7を実行しています。ユーザーがレコードを最後に表示したときのタイムスタンプである「last_view」フィールドを持つモデルがあります。フロントページに、先週最も閲覧された10個のアイテムを表示したいので、ListViewでクエリセットにこれを使用してみました。
startdate = timezone.now() - datetime.timedelta(days=7)
enddate = timezone.now()
urlpatterns = patterns('',
url(r'^$',
ListView.as_view(
queryset=Tag.objects.filter(last_view__range=([startdate, enddate])).order_by('-views')[:10],
context_object_name='most_viewed_list',
template_name='tags/index.html'),
name='index'),
これは、最初にページを読み込んだときに機能します。レコードのいずれかをクリックして「表示」すると、データベースのlast_view属性が更新されますが、ページをリロードすると、このアイテムは「最近表示された」リスト(上記のクエリセットによって形成されます)から消えます。
問題はこの投稿に関連していると思いました。timezone.now()の「終了日」は、サーバープロセスを開始するタイミングによって制限されているようです。したがって、サーバーの実行後にリンクをクリックすると、「現在の時刻」は「now()」と比較して将来的になり、範囲外になります(そのため、クリックしたレコードはページの再読み込み時に表示されなくなります)。ただし、上記の投稿のように今すぐに変更すると、ページの読み込み時にエラーが発生します。
startdate = timezone.now - datetime.timedelta(days=7)
enddate = timezone.now
-:'function'および'datetime.timedelta'のサポートされていないオペランドタイプ
そのため、startdate変数を作成できません。クエリセットを_rangeから_gteに変更することでこれを機能させることができますが、now()が実際に「現在の時刻」ではなくサーバープロセスの開始時にタイムスタンプが付けられている場合、時間の経過とともに中断するようです。
queryset=Tag.objects.filter(last_view__gte=(timezone.now() - datetime.timedelta(days=7)).order_by('-views')[:10]
テストに関するDjangoチュートリアルでは、日付を超えてクエリを実行する際のnowの使用法は示されていますが、 nowから日数を減算する方法や、timedeltaまたは日付範囲で使用する方法は示されていません...
誰かが実際の現在の時刻との時差を取る方法、つまりnow()の代わりにnowを使用する方法を説明できますか?また、 now()とnowの使用の制限についても理解を深めたいと思います。timedelta()で見つけることができるすべての例は、timezone.now()またはdatetime.now()を参照しているため、これに関する優れたドキュメントは見つかりません。
ありがとう!