/ / Zeitzone in Django, DRF und PostgreSQL richtige Einstellungen - Django, Zeitzone, Django-Rest-Framework

Zeitzone in Django, DRF und PostgreSQL-Einstellungen - django, timezone, django-rest-framework

Ich habe die Zeitzone in Django 1.8 konfiguriert (meine aktuelle Zeitzone ist UTC + 1 oder BST):

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

Ich habe ein Timestamp-Attribut in meinem Modell:

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)

Ich habe Django Rest Framework 3.4.0, also, wenn ich Daten über DRF Web-Schnittstelle Zeitstempel post auf UTC automatisch, die 1 Stunde zurück von meiner aktuellen Zeit (UTC + 1) ist. Im PostgreSQL-Zeitstempelfeld wird jedoch als UTC + 1 festgelegt. Auf der DRF-Weboberfläche wird jedoch immer die Zeit in UTC angezeigt.

Was für ein komisches Verhalten. Was ist ein Grund dafür?

Vielen Dank im Voraus für Anregungen!

Antworten:

2 für die Antwort № 1

Während Zeiten werden in die lokale Zeitzone konvertiertIn Templates und Formularen werden sie nicht für Serializer konvertiert (und sind daher normalerweise UTC außer bei der Objekterstellung, wenn sie vom Client hochgeladen werden). Die Annahme ist, dass jeder, der die API verwendet, sie über einen Client mit einer eigenen Art der Verarbeitung von Zeitzonen verwendet.

Die Lösung besteht darin, ein benutzerdefiniertes Datetime-Feld zu erstellen, das in die richtige Zeitzone konvertiert. Siehe hier: DjangoRestFramework ModelSerializer DateTimeField konvertiert bei der Objekterstellung nur in die aktuelle Zeitzone

Außerdem: Vorsicht vor dem PostgreSQL-Timestamp-Feld. Es gibt lediglich an, dass die Zeiten in die Zeitzone konvertiert wurden, in der sich der Server befindet (wie in der Dokumentation):

Alle zeitzonenbewussten Daten und Uhrzeiten werden intern in UTC gespeichert. Sie werden in der vom Konfigurationsparameter timezone angegebenen Zone in die lokale Zeit konvertiert, bevor sie dem Client angezeigt werden.