2017-02-10 36 views
0

Ich habe folgendes Modell und Formdjango und Postgres Datetimefield

class TravelShare(Share): # indirect derived via Share from models.Model 
    source = models.PointField(geography=True, srid=4326) 
    destination = models.PointField(geography=True, srid=4326) 
    departure = models.DateTimeField(default=timezone.now) 
    departure_delta = models.SmallIntegerField(default=60) 

    objects = TravelShareManager() 

    def __str__(self): 
     return self.id 

class TravelShareForm(forms.ModelForm): 

    class Meta: 
     model = TravelShare 
     fields = ['source', 'destination', 'departure', 'departure_delta'] 

Beim Testen der Form mit

def test_TravelShareCreate(self): 

    source = Point(x=48.0, y=11.0, srid=4326) 
    destination = Point(x=48.0001, y=11.0001, srid=4326) 
    now = timezone.localtime(timezone.now()) 
    print ("now : %s" % (now)) 
    now_string = now.strftime('%m.%d.%Y %H:%M:%S') 

    form_data = { 

     'source': source, 
     'destination': destination, 
     'departure': now_string, 
     'departure_delta': 30, 

    } 

    form = TravelShareForm (form_data) 
    print (form.errors) 
    self.assertTrue(form.is_valid()) 

    form.instance.creator = self.creator 
    result = form.save() 
    self.assertEqual(result.creator_id, self.creator.id) 
    self.assertEqual(result.source, source) 
    self.assertEqual(result.destination, destination) 
    result_dep = timezone.localtime(result.departure) 
    print("result_dep : %s" % (result_dep)) 
    self.assertEqual(result.departure, now) 

Ich bin schließlich in

jetzt: 2017.02.10 15 : 49: 21.935894 + 01: 00

result_dep: 2017-10-02 15: 49: 21 + 02: 00

Failure

Traceback (jüngste Aufforderung zuletzt): File "/home/michael/PycharmProjects/sharadar/main/tests/test_forms.py", Zeile 43, in test_TravelShareCreate self.assertEqual (result.departure , jetzt) ​​ AssertionError: Datum [14 Zeichen] 017, 10, 2, 15, 49, 21, tzinfo = DstTzInfo 'Eur [25 Zeichen] DST)! = Datum [14 Zeichen] 017, 2, 10, 15, 49 , 21, 935894, Tzinfo = DstTzI [32 Zeichen] STD

Es scheint, dass die resultierende Datetime eine andere TZ oder zumindest zeigt hat +2 statt +1

Danke für jede Hilfe

Michael

+0

Ich habe es gefunden. Das Ergebnis aus der Datenbank wird auf Sekunden gerundet und somit 15: 49.21.93894 + 1.00 wird 15: 49: 21 + 02: 00 – mbieren

Antwort

0

The result from the database is rounded to seconds and therefor 15:49.21.93894+1.00 becomes 15:49:21+02:00

Es ist völlig falsch. Sie haben Mikrosekunden Teil beim Konvertieren von Datetime-Objekt in Zeichenfolge now.strftime('%m.%d.%Y %H:%M:%S') fallen gelassen. Und auch +02:00 ist eine Zeitzone Utc Offset von Datetime-Objekt. Es sind keine runden Sekunden oder was auch immer.

Und das eigentliche Problem war in Ihrem strftime String-Format. Heute hat Ihre Zeitzone wahrscheinlich Sommerzeit. Wenn Sie jedoch eine falsche formatierte Datetime-Zeichenfolge an Formular übergeben haben, hat das Django-Formular den Stand 2017-10-02 (02. Oktober 2017) als Standardzeit in Ihrer Zeitzone analysiert. Also, das war der Grund, warum Sie verschiedene utc Offsets haben: +01: 00 und +02: 00.

+0

Sie haben Recht. Ich habe meine Antwort mit dem neuen Test aktualisiert, der jetzt strftime verwendet ('% d.% M.% Y% H:% M:% S') in beiden Fällen – mbieren

0

Das Ergebnis aus der Datenbank wird auf Sekunden abgerundet und dafür 15: 49.21.93894 + 1,00 wird zu 15: 49: 21 + 02: 00

Neben der Tatsache, dass das Format Strftime Zeichenfolge sollte sein: ('% d.% m.% Y% H:% M:% S') anstelle von ('% m.% d.% Y% H:% M:% S')

Mein Test wie dies jetzt:

class TestTravelShareForm(TestCase): 

def setUp(self): 
    self.creator = ShrUser.objects.create_user(username="foo", email="[email protected]", password="bla") 
    self.source = Point(x=48.0, y=11.0, srid=4326) 
    self.destination = Point(x=48.0001, y=11.0001, srid=4326) 
    self.now = timezone.now() 
    self.now_string = self.now.strftime('%d.%m.%Y %H:%M:%S') 

def test_TravelShareCreate(self): 

    form_data = { 

     'source': self.source, 
     'destination': self.destination, 
     'departure': self.now_string, 

    } 

    form = TravelShareForm (form_data) 
    self.assertTrue(form.is_valid()) 

    form.instance.creator = self.creator 
    result = form.save() 

    self.assertEqual(result.creator_id, self.creator.id) 
    self.assertEqual(result.source, self.source) 
    self.assertEqual(result.destination, self.destination) 

    result_dep = result.departure.strftime('%d.%m.%Y %H:%M:%S') 

    self.assertEqual(result_dep, self.now_string) 
Verwandte Themen