/ / Часова зона в Django, DRF и PostgreSQL - django, часова зона, django-rest-framework

Часова зона в Джанго, DRF и PostgreSQL правилни настройки - django, часова зона, django-rest-framework

Имам конфигурирана часова зона в Django 1.8 (текущата ми часова зона е UTC + 1 или BST):

TIME_ZONE = "Europe/London"
USE_I18N = True
USE_L10N = True
USE_TZ = True

Имам атрибут на таймаут в моя модел:

class NodeGPS(models.Model):
node_id = models.ForeignKey(Node)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
gps_latitude = models.FloatField(null=True, blank=True)
gps_longitude = models.FloatField(null=True, blank=True)

Имам Django Rest Framework 3.4.0, така че когато публикувам данни през DRF уеб интерфейс, времето за маркиране е настроено на UTC автоматично, което е 1 час назад от текущото ми време (UTC + 1). Въпреки това, в полето PostgreSQL полета за времеви маркери е зададено като UTC + 1. Но на уеб интерфейса на DRF той винаги показва времето в UTC.

Какво странно поведение. Каква е причината за това?

Благодаря предварително за всички предложения!

Отговори:

2 за отговор № 1

Докато времето се превръща в местната часова зонав шаблони и формуляри, те не се преобразуват за serializers (и по този начин обикновено са UTC, освен при създаване на обект, когато са каквато и да е качването на клиента). Предполага се, че всеки, който използва API, ще го използва чрез клиент със свой собствен начин за обработка на часови зони.

Решението е да създадете персонализирано поле за datetime, което да се преобразува в правилната часова зона. Виж тук: DjangoRestFramework ModelSerializer DateTimeField само превръщането в текуща часова зона при създаване на обект

Също така: Пазете се от полето за полет на PostgreSQL. Тя просто показва, че времето е преобразувано в часовата зона, която сървърът мисли, че е в, тъй като (от документите):

Всички дати и часове във времевата зона се съхраняват вътрешно в UTC. Те се преобразуват в локално време в зоната, определена от конфигурационния параметър на часова зона, преди да бъдат показани на клиента.