12

を含むモデルがありますdatefield。現在の週を含むそのモデルのクエリ セットを取得しようとしています (月曜日に開始)。

したがって、Djangodatefieldには単純なdatetime.dateモデルが含まれているため、 を使用してフィルタリングすると仮定しました.isocalendar()。論理的には、現在の曜日による追加の比較や計算を行わなくても、まさに私が望むものです。

したがって、私が本質的にやりたいことは.filter、このロジックで動作するステートメントを強制することです。

if model.date.isocalendar()[2] == datetime.date.today().isocalendar()[2]
    ...

しかし、フィルターステートメント内にそれを記述する方法は? .filter(model__date__isocalendar=datetime.date.today().isocalendar())間違った結果が得られます (今週ではなく今日と比較するのと同じです)。

真のhttp://docs.python.org/library/datetime.htmlを掘り下げているので、他の平日のオプションに気づいていません...

ドキュメントからのメモ:

date.isocalendar() 3 つのタプル (ISO 年、ISO 週番号、ISO 曜日) を返します。

アップデート:

範囲を使用するソリューションは嫌いでしたが、これが最良の選択肢です。ただし、私の場合、週の始まりを示す変数を作成し、現在の週の一致を探している場合は、それ以上の値または等しい値に見えるようにしました。週数を指定する場合 両端が必要になります。

today = datetime.date.today()
monday = today - datetime.timedelta(days=today.weekday())

... \
.filter(date__gte=monday)
4

4 に答える 4

9

あなたはこれを行うことができません。Python がサポートするものだけの問題ではなく、Django はフィルタをデータベースに伝達する必要があり、データベースはそのような複雑な日付計算をサポートしていないことを忘れないでください。ただし、開始日と終了日を指定して を使用できます。__range

于 2012-05-09T14:35:06.847 に答える
2

ExtractWeek は Django 1.11 で isoweek 番号に基づいてフィルタリングするために導入されました。

Django 1.10 以前のバージョンでは、postgres データベースの iso 番号週によるフィルタリングに次のソリューションが機能します。

from django.db.models.functions import Extract
from django.db import models
@models.DateTimeField.register_lookup
class ExtractWeek(Extract):
    lookup_name = 'week'

次のようにクエリを実行します

queryset.annotate(week=ExtractWeek('date'))\
            .filter(week=week_number)
于 2016-11-26T16:00:16.470 に答える
1

(この回答は postgres でのみ機能するはずですが、他のデータベースでも機能する可能性があります。)

この問題に対する迅速で洗練された解決策は、次の 2 つのカスタム トランスフォーマーを定義することです。

from django.db import models
from django.db.models.lookups import DateTransform

@models.DateTimeField.register_lookup
class WeekTransform(DateTransform):
    lookup_name = 'week'


@models.DateTimeField.register_lookup
class ISOYearTransform(DateTransform):
    lookup_name = 'isoyear'

これで、次のように週ごとにクエリを実行できます。

from django.utils.timezone import now
year, week, _ = now().isocalendar()

MyModel.objects.filter(created__isoyear=year, created__week=week)

舞台裏では、Djangoオブジェクトは、およびをサポートDateTransformする postgresEXTRACT関数を使用します。weekisoyear

于 2016-05-01T15:03:46.650 に答える