2

Django 时区字段基于pytz timezones构建,但后者的某些时区对字段无效。像这样的模型

from django.db import models
from timezone_field import TimeZoneField

class TestModel(models.Model):
    timezone_field = TimeZoneField(default='UTC')

def save(self, *args, **kwargs):
    self.clean()
    self.full_clean()
    super().save(*args, **kwargs)

如果我运行(在外壳中)

import pytz
from models import TestModel

model = TestModel.objects.get(id=1)

for zone in pytz.all_timezones:
    model.timezone = zone
    model.save()

我明白了

django.core.exceptions.ValidationError: {'timezone': ["Value <DstTzInfo 'Africa/Asmera' LMT+2:27:00 STD> is not a valid choice."]}

所以它首先失败'Africa/Asmera'(它也失败了其他人,例如'GMT+0')。

知道如何解决这种不一致吗?目前,用户可以在前端选择一个时区,这将导致后端错误(前端内置于 React 并从时刻 timezone获取时区)

4

1 回答 1

4

正如 Willem 在 Django Timezone Fields 的 V1.2 中提到的,他们将字段的默认选项从 更改all_timezonescommon_timezones. choices您可以通过在字段定义中显式设置属性来恢复此更改。

https://github.com/mfogel/django-timezone-field

1.2 (2015-02-05) 对于表单字段,将接受时区的默认列表从 pytz.all_timezones 更改为 pytz.common_timezones,以匹配 DB 字段行为。1.1 (2014-10-05) Django 1.7 兼容性 除了以前的 [[, ], ...] 格式之外,还添加了对将选项 kwarg 格式化为 [[, ], ...] 的支持。将接受时区的默认列表从 pytz.all_timezones 更改为 pytz.common_timezones。如果您的数据库中有位于 pytz.all_timezones 但不在 pytz.common_timezones 中的时区,则这是一个向后不兼容的更改。可以通过在模型定义中为 pytz.all_timezones] 中的 tz 指定选项来恢复旧行为。

class TestModel(models.Model):
    timezone_field = TimeZoneField(default='UTC', choices=[(tz, tz) for tz in pytz.all_timezones])

有一个关于这是向后不兼容的更改的免责声明;所以我敦促你进一步调查

于 2018-05-10T10:36:31.043 回答