2016-07-08 5 views
0

Werfen, habe ich ein Modell namens ScheduleItemDjango speichern Aufschalten So Primary Doppelte Fehler

class ScheduleItem(models.Model): 
     agreement = FK 
     location = FK 
     start = models.DateTimeField() 
     end = models.DateTimeField() 
     totalHours = DecimalField 

     def get_total_hours(self): 
      start = timedelta(hours=self.start.hour, minutes=self.start.minute) 
      end = timedelta(hours=self.end.hour, minutes=self.end.minute) 
      td = (end-start).seconds 
      totalHours=Decimal(td/Decimal(60)/Decimal(60)) 
      return totalHours 

    def save(self,*args,**kwargs): 
      if self.pk == None: 
       super(ScheduleItem,self).save(self,*args,**kwargs) 
       self.refresh_from_db() # to access the datetime values, rather than unicode POST 
       self.totalHours = self.get_total_hours() 
      else: 
       self.totalHours = self.get_total_hours() 

      super(ScheduleItem,self).save(self,*args,**kwargs) 

Dieser Primärschlüssel wirft. Ich bekomme doppelte Einträge mit dem zweiten Super (ScheduleItem, self). Ich kann nicht für das Leben von mir herausfinden, wie man nach PK sucht, um auf den Datetime-Wert zuzugreifen, und dann erneut innerhalb der Save Override-Methode speichern. Ich habe versucht, Dinge zu verschieben, ich habe versucht, in der get_total_hours() -Funktion zu speichern, mit nichts als Ärger.

Ich möchte nur das Objekt an die db Committed, so dass ich die Datetime-Objekte abrufen und dann die Gesamtstunden berechnen kann.

Ich würde lieber nicht zu Datetime innerhalb der Speicherfunktion konvertieren.

Hat jemand einen Tipp oder kann mir jemand sagen, wo ich falsch liege?

+0

Haben Sie id = models.AutoField (primary_key = True) in Ihrem Modell definiert? –

Antwort

5

Sie sollten self nicht an save() übergeben. Sie rufen super().save() als gebundene Methode für eine Instanz auf, sodass self implizit als erstes Argument übergeben wird. Ändern Sie diese an:

def save(self,*args,**kwargs): 
    if self.pk is None: 
     super(ScheduleItem,self).save(*args,**kwargs) 
     self.refresh_from_db() # to access the datetime values, rather than unicode POST 
     self.totalHours = self.get_total_hours() 
    else: 
     self.totalHours = self.get_total_hours() 

    super(ScheduleItem,self).save(*args,**kwargs) 

Sie dieses seltsame Verhalten, weil das erste Positions Argument force_insert ist, und die Modellinstanz ausgewertet True. Der zweite Aufruf an super().save() versucht, eine Einfügung mit demselben Pk zu erzwingen, das zuvor gespeichert wurde.

+0

Ja! Das macht Sinn. Ich werde zurückgehen und die Dokumente durchlesen, um sie besser in den Griff zu bekommen. Danke für die Hilfe! – Craig

+0

Verwenden: 'self.pk ist keine'. – allcaps

+0

@allcaps Warum? Gibt es ein potentielles Problem mit == dass ich vermisse? – Craig