我想在Django中編寫一個自定義PostgreSQL函數,該函數會將日期時間強制轉換爲查詢集內的指定時區。我在DB函數第一遍看起來是這樣的:DjangoORM:在自定義數據庫函數中解析F表達式
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
只會將字符串F('time_zone')
注入到sql中而不是解析字段。
是否可以將F Expressions的支持添加到此函數中?我應該考慮一些其他方法嗎?
嘿,這太棒了!感謝您提供此解決方案。我將你的回答作爲接受的答案,因爲它肯定更適合猴子補丁(正如你在評論中提到的那樣)。 – chukkwagon