我正在尝试在 Django 中编写一个自定义 PostgreSQL 函数,它将强制日期时间到查询集中的指定时区。我第一次通过 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
将简单地将字符串F('time_zone')
注入 sql 而不是解析字段。
是否可以向此函数添加对F 表达式的支持?我应该考虑其他一些方法吗?