日時をクエリセット内の指定されたタイムゾーンに強制するカスタム 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 式のサポートを追加することは可能ですか? 私が考慮すべき他のアプローチはありますか?