/ / Časové pásmo v Django, správne nastavenia DRF a PostgreSQL - django, časové pásmo, django-rest-framework

Časové pásmo v Django, správne nastavenia DRF a PostgreSQL - django, timezone, django-rest-framework

Mám nakonfigurovanú časovú zónu v Django 1.8 (moja súčasná časová zóna je UTC + 1 alebo BST):

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

Mám atribút časovej značky v mojom modeli:

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)

Mám Django Rest Framework 3.4.0, takže keď posielam dáta prostredníctvom webového rozhrania DRF, časové označenie je automaticky nastavené na UTC, čo je 1 hodina späť od môjho aktuálneho času (UTC + 1). Avšak v poli PostgreSQL je časové označenie nastavené ako UTC + 1. Ale na webovom rozhraní DRF vždy ukazuje čas v UTC.

Aké divné správanie. Aký je dôvod pre to?

Vopred ďakujeme za akékoľvek návrhy!

odpovede:

2 pre odpoveď č. 1

Kým sa časy premenia na miestnu časovú zónuv šablónach a formulároch nie sú konvertované na serializátory (a preto sú zvyčajne UTC, s výnimkou pri vytváraní objektov, ak sú bez ohľadu na to, kto bol odovzdaný klientom). Predpokladom je, že ktokoľvek, kto používa rozhranie API, ho bude používať prostredníctvom klienta s vlastným spôsobom spracovania časových pásiem.

Riešením je vytvoriť vlastné pole dátumu, ktoré sa prevádza na správnu časovú zónu. Pozri tu: DjangoRestFramework ModelSerializer DateTimeField len konverzia na aktuálnu časovú zónu pri vytváraní objektov

Tiež: Dajte si pozor na pole časovej pečiatky PostgreSQL. Jednoducho naznačuje, že časy boli konvertované na časové pásmo, o ktorom sa domnieva, že server je, pretože (z dokumentov):

Všetky dátumy a časy s časovým pásmom sa ukladajú interne v UTC. Prevedú sa na miestny čas v zóne špecifikovanej konfiguračným parametrom časového pásma predtým, ako sa zobrazia klientovi.