Поля часового пояса Django не принимают все часовые пояса Pytz - PullRequest
0 голосов
/ 10 мая 2018

Поля часового пояса Джанго построены на точках времени Pytz , но некоторые из часовых поясов последнего недопустимы для полей. С моделью типа

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 и получает часовые пояса из момента времени )

1 Ответ

0 голосов
/ 10 мая 2018

Как упомянул Виллем в версии 1.2 Поля часового пояса Джанго, они изменили выбор поля по умолчанию с all_timezones на common_timezones. Вы можете отменить это изменение, явно указав атрибут choices в определении поля.

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

1.2 (2015-02-05) Для поля формы изменен список принятых часовых поясов по умолчанию с pytz.all_timezones на pytz.common_timezones, чтобы соответствовать Поведение поля БД. 1.1 (2014-10-05) Совместимость с Django 1.7 Добавлена ​​поддержка форматирования вариантов kwarg как [[,], ...], в дополнение к предыдущему формату из [[,], ...]. Изменен список принятых по умолчанию часовые пояса от pytz.all_timezones до pytz.common_timezones. если ты есть часовые пояса в вашей БД, которые находятся в pytz.all_timezones, но не в pytz.common_timezones, это несовместимое с прошлым изменение. старый поведение может быть восстановлено, указав выбор = [(tz, tz) для tz в pytz.all_timezones] в определении вашей модели.

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

Есть оговорка, что это несовместимое изменение назад; поэтому я призываю вас изучить это подробнее

...