/ / Strefa czasowa w odpowiednich ustawieniach Django, DRF i PostgreSQL - django, timezone, django-rest-framework

Strefa czasowa w Django, DRF i właściwe ustawienia PostgreSQL - django, timezone, django-rest-framework

Mam skonfigurowaną strefę czasową w Django 1.8 (moja aktualna strefa czasowa to UTC + 1 lub BST):

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

Mam atrybut timestamp w moim modelu:

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)

Mam Django Rest Framework 3.4.0, więc gdy wysyłam dane przez interfejs internetowy DRF, znacznik czasu jest ustawiony na UTC automatycznie, co oznacza 1 godzinę wstecz od mojego bieżącego czasu (UTC + 1). Jednak w PostgreSQL znacznik czasu jest ustawiony jako UTC + 1. Ale w interfejsie internetowym DRF zawsze pokazuje czas w UTC.

Cóż za dziwne zachowanie. Jaki jest tego powód?

Z góry dziękuję za wszelkie sugestie!

Odpowiedzi:

2 dla odpowiedzi № 1

Podczas gdy czasy są zamieniane na lokalną strefę czasowąw szablonach i formularzach, nie są one konwertowane dla serializerów (i dlatego są zwykle UTC, z wyjątkiem tworzenia obiektów, gdy są one takie, jakie klient przesłał). Zakłada się, że każdy, kto korzysta z API, będzie go używał za pośrednictwem klienta z własnym sposobem obsługi stref czasowych.

Rozwiązaniem jest utworzenie niestandardowego pola datetime, które zostanie przekształcone we właściwą strefę czasową. Spójrz tutaj: DjangoRestFramework ModelSerializer DateTimeField tylko konwertuje do aktualnej strefy czasowej podczas tworzenia obiektu

Ponadto: Uważaj na pole znaczników PostgreSQL. Jest to jedynie wskazanie, że czasy zostały zamienione na strefę czasową, o której serwer myśli, że jest, jako (z dokumentów):

Wszystkie daty i godziny związane ze strefami czasowymi są przechowywane wewnętrznie w UTC. Są konwertowane na czas lokalny w strefie określonej przez parametr konfiguracyjny strefy czasowej przed wyświetleniem klientowi.