【发布时间】:2019-05-13 22:52:19
【问题描述】:
在 Django Rest Framework 中使用任意时区返回某些 Django 模型的DateTimeField 的 Python 方式是什么?
目前我的视图以 UTC 格式返回 DateTime,因为据我所知,Django 将时区感知的日期时间存储为 UTC 时区中的日期时间。
型号:
class TimezoneMixin(models.Model):
TIMEZONES = [(i, i) for i in country_timezones['ru']]
timezone = models.CharField(choices=TIMEZONES, ...)
class Meta:
abstract = True
def get_timezone(self):
if self.timezone:
return timezone(self.timezone)
return get_current_timezone()
class Organization(TimezoneMixin, models.Model):
...
class Event(models.Model):
organization = models.ForeignKey(Organization, ...)
date_created = models.DateTimeField(auto_now_add=True, ...)
...
序列化器:
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = ('organization', 'date_created', ...)
在 ViewSet 中,我按如下方式填充数据
organization_id = ... # Some logic to get required organization_id
data = {
'date_created': timezone.now(), # django.utils.timezone
'organization': organization_id,
...
}
serializer = EventSerializer(data=data)
if serializer.is_valid():
serializer.save()
response_data = serializer.data.copy()
# Some logic to rename one of the keys in response data
...
return Response(response_data, ...) # rest_framework.response.Response
即使我将 timezone.now() 替换为 timezone.now().astimezone(organization.get_timezone()) 之类的东西,我仍然会收到 UTC DateTime 作为响应。
我是否正确,从 response_data 解析 date_created 字符串,从中创建一个 DateTime 对象,转换为不同的时区并在视图末尾再次格式化为字符串不是一个好主意?还有哪些方法?
【问题讨论】:
-
最明智的方法是在任何地方都使用时区感知或 UTC,并且只在显示时转换为本地时区。
-
日期时间可以同时是时区感知和 UTC 我错了吗?
-
他们可以(
timezone.now()是)。然后他们知道是 UTC。 -
理想情况下,API 应该是 UTC。显示时间是呈现给最终用户的时间。例如,在 JS 代码中,您可以在浏览器中查询用户的时区并相应地显示。 — 在 API 中包含当地时间只会让开发人员混淆它实际上是哪个时区(它取决于服务器位置吗?它是 UTC 吗?它是否取决于某些用户设置?它是否尝试使用 geoip 检测客户端时区?什么?如果我通过代理?)
-
感谢您的建议。作为用户,我也更愿意使用基于 UTC 的 API。但是,由于 API 客户端的当前限制,我需要在不同的时区发送响应。
标签: python django datetime django-rest-framework timezone