13

先週(7日前ではない)からデータを取得する方法について、djangoで問題が発生しています。使用date.isocalendar()[1]すると素晴らしいでしょう。ただし、いくつかのスタックオーバーフローブラウジングでは、満足のいく結果が得られませんでした。

INTERVALなんといっても、移植性がなくても mysql の機能を使えばよいのです。これは、django の ORM を使用して作成したいクエリです。

SELECT id, user_id, CAST(timestamp AS Date), WEEK(timestamp,3), WEEK(CURDATE(), 3) FROM main_userstats WHERE week(timestamp, 3) = WEEK(DATE_SUB(CURDATE(), INTERVAL 1 WEEK ), 3)

djangoの関数を使用してこれを行うにはextraどうすればよいですか (他の簡単な方法で行うことができない場合)。

4

3 に答える 3

34

あなたが探しているのは、前の週の同じ暦週に属するすべてのエントリであると思います。

これでうまくいくはずです:

class Entry(models.Model):
    pub_date = models.DateField([...])

オブジェクトを取得するには:

from datetime import timedelta
from django.utils import timezone
some_day_last_week = timezone.now().date() - timedelta(days=7)
monday_of_last_week = some_day_last_week - timedelta(days=(some_day_last_week.isocalendar()[2] - 1))
monday_of_this_week = monday_of_last_week + timedelta(days=7)
Entry.objects.filter(created_at__gte=monday_of_last_week, created_at__lt=monday_of_this_week)

先週の日曜日を取得するために 6 日を追加する代わりに、今週の月曜日を取得するために 7 日を追加したことと、(__lte= の代わりに) created_at__lt=monday_of_this_week を使用したことに注意してください。pub_date が DateTimeField の場合、now().date() を使用すると時刻が 00:00:00 になるため、日曜日のオブジェクトが含まれないためです。

これは、代わりに日曜日を週の最初の日と見なすように簡単に調整できますが、 isocalendar() はそれを最後と見なすので、それを採用しました。

Django < 1.4 を使用している場合は、次を使用します。

from datetime import date, timedelta
some_day_last_week = date.today() - timedelta(days=7)

それ以外の:

from datetime import timedelta
from django.utils import timezone
some_day_last_week = timezone.now().date() - timedelta(days=7)
于 2012-10-01T22:48:12.513 に答える
9

Django ORMのfilterメソッドを見てください。

基本的な例:

class Entry(models.Model):
  pub_date = models.DateField([...])

Entry.objects.filter(pub_date__year=2006)

ただし、次のようなフィルターを使用して、より複雑なクエリを実行できます。

Entry.objects.filter(pub_date__gte=datetime.now())

datetimeご覧のとおり、特定の日付を定義するために および他の Python ライブラリを使用できます。どのような可能性があるかを確認するには、フィールド ルックアップのドキュメントを参照してください。

あなたの場合、次のようなことができます(このStackoverflowの投稿に触発されました):

from datetime import date, timedelta

d=date.today()-timedelta(days=7)
Entry.objects.filter(pub_date__gte=d)

このルックアップが機能するかどうかは 100% 確信が持てませんが、正しい方向です。

于 2012-06-26T10:36:56.163 に答える