3

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()を参照しているため、これに関する優れたドキュメントは見つかりません。

ありがとう!

4

1 に答える 1

7

メソッドをサブクラスListView化してオーバーライドしますget_queryset。メソッド内のstartdateとを計算することにより、が最初にロードされたときではなく、リクエストが行われた時間になります。enddateget_querysettimezone.now()urls.py

class TagListView(ListView):
    def get_queryset(self):
        startdate = timezone.now() - datetime.timedelta(days=7)
        enddate = timezone.now()
        return Tag.objects.filter(last_view__range=[startdate, enddate]).order_by('-views')[:10]
    context_object_name='most_viewed_list'
    template_name='tags/index.html'

urlpatterns = patterns('',
    url(r'^$', TagListView.as_view(), name='index'),
)
于 2012-12-29T03:44:27.417 に答える