2

日時をクエリセット内の指定されたタイムゾーンに強制するカスタム PostgreSQL 関数を Django で作成しようとしています。db 関数での最初のパスは次のようになります。

from django.db.models.expressions import Func

class DateTimeInTimezone(Func):
    template="%(expressions)s AT TIME ZONE %(tz_info)s"

この関数は、次のようにタイムゾーン文字列を関数に直接渡す単純なケースで機能します。

MyModel.objects.filter(timefield__gte=DateTimeInTimezone(Now(), tz_info='EST'))

ただし、タイムゾーンがモデルのフィールドで定義されている、より複雑なケースでは機能しません。次の不自然な例を考えてみましょう:

class User(models.Model):
    time_zone = models.CharField()

class Meeting(models.Model):
    users = models.ManyToManyField(User, related_name='meetings')
    start_time = models.DateTimeField()  # in UTC
    end_time = models.DateTimeField()  # in UTC

「今日の現地時間午後 12 時に会議に参加するユーザーは?」という質問に答えるには、次のクエリセットのバリエーションが必要です。

noon_utc = ...
User.objects.filter(
    meetings__start_time__lte=DateTimeInTimezone(noon_utc, tz_info=F('time_zone')),
    meetings__end_time__gt=DateTimeInTimezone(noon_utc, tz_info=F('time_zone'))
)

ただし、現在書かれているように、フィールドを解決するのではなく、DateTimeInTimezone単純に文字列を sql に挿入します。F('time_zone')

この関数にF 式のサポートを追加することは可能ですか? 私が考慮すべき他のアプローチはありますか?

4

2 に答える 2