2016-09-06 8 views
6

Ich arbeite mit einigen Modellen, die eine Summe von Modellfeldern zurückgeben müssen. Ist es besser, die Speichermethode für das Modell zu überschreiben oder einfach eine benutzerdefinierte Methode zu erstellen, die die Summe zurückgibt? Gibt es Leistungsprobleme mit einer der beiden Lösungen?Django-Modell, Überschreiben der Speichermethode oder der benutzerdefinierten Methode mit der Eigenschaft

Option 1: Überschreiben der Speichermethode.

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    sum_integers = models.IntegerField() 

    def save(self, *args, **kwargs): 
     self.sum_integers = sum(
      [self.integer1, self.integer2, self.integer3]) 
     self.sum_integers.save() 
     return super(SomeModel, self).save(*args, **kwargs) 

Option 2: Benutzerdefinierte Methode

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    @property 
    def sum_integers(self): 
     return sum([self.integer1, self.integer2, self.integer3]) 

Antwort

2

Die Antwort auf die Art und Weise ab, die Sie gehen sum_integers zu verwenden. Wenn Sie es als ein Feld in DB behalten, werden Sie in der Lage sein, Abfragen darauf zu machen, und mit der Eigenschaft wäre es sehr schwierig.

Auf der anderen Seite, wenn Sie keine Abfragen erstellen und diese Daten nicht wertvoll für Sie (mit anderen Worten - Sie brauchen sum_integers als Datendarstellung) dann sollten Sie mit der Eigenschaft gehen.

Vom Punkt der Anwendungsleistung: Wenn Sie komplexe Operationen auf Tausende von Objekten machen wollen - es könnte besser sein, den Wert in der Spalte oder zumindest Änderungseigenschaft auf cached_property zu speichern, wenn es ein paar Mal aufgerufen .

Als Zusammenfassung - Speichern von Wert der Summe in DB-Spalte ist universeller und hat keine Downgrades, aber in einigen Fällen property Ansatz ermöglicht es Ihnen, Ihr Datenmodell sauberer zu halten und Speicherplatz auf Ihrer Festplatte zu sparen.

Ich hoffe, es ist eine Antwort auf Ihre Frage. Bitte füllen Sie frei, um Fragen zu stellen, wenn etwas unklar ist.

+0

Danke, schöne Erklärung der Vor- und Nachteile. – Andreas

2

Hängt davon ab, ob Sie die Felder mehr aktualisieren oder die Summe mehr aufrufen müssen.

Ich nehme an, um es allgemeiner zu machen, dass die Operation nicht nur Addition, sondern mehrere komplexe Berechnung mit großen Zahlen ist.

Wenn Sie die Summe hin und wieder erhalten müssen, dann ist es besser, ein Modellfeld zu erstellen und beim Speichern Wert hinzuzufügen.

Wenn Sie es meistens aktualisieren müssen, ist es normalerweise angemessener, den Wert beim Aufruf (die zweite Methode) zu erhalten.

Verwandte Themen