2016-09-06 13 views
6

Pracuję z niektórymi modelami, które muszą zwrócić sumę pól modelu. Czy lepiej zastąpić metodę zapisu w modelu lub po prostu stworzyć niestandardową metodę, która zwraca sumę. Czy są jakieś problemy z wydajnością z jednym z rozwiązań?Model Django, Przesłanianie metody składowania lub metody niestandardowej za pomocą właściwości

Opcja 1: Zastąpienie metody zapisu.

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) 

Opcja 2: Metoda klienta

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]) 

Odpowiedz

2

Odpowiedź zależy od sposobu masz zamiar użyć sum_integers. Jeśli zachowasz go jako pole w DB, będziesz mógł tworzyć zapytania, a przy pomocy własności będzie to bardzo trudne.

Z drugiej strony, jeśli nie zamierzasz zadawać pytań, a dane te nie są dla ciebie cenne (innymi słowy - potrzebujesz reprezentacji danych jako sum_integers) to powinieneś iść z własnością.

Z punktu widzenia wydajności aplikacji: Jeśli zamierzasz wykonywać złożone operacje na tysiącach obiektów - lepiej byłoby zapisać wartość w kolumnie lub przynajmniej zmienić właściwość na cached_property, jeśli jest ona wywoływana kilka razy .

Podsumowując - przechowywanie wartości sum w kolumnie DB jest bardziej uniwersalne i nie ma żadnych obniżek, ale w niektórych przypadkach podejście property pozwala zachować czystość modelu danych i oszczędza miejsce na dysku.

Mam nadzieję, że jest to odpowiedź na twoje pytanie. Wypełnij za darmo, aby zadać pytanie, jeśli coś jest niejasne.

+0

Dzięki, ładne wyjaśnienie plusów i minusów. – Andreas

2

Zależy od tego, czy należy zaktualizować pola więcej, czy też połączyć je z kwotą większą.

Przyjmuję, aby uczynić go bardziej ogólnym, że operacja jest nie tylko dodatkiem, ale wieloma złożonymi obliczeniami obejmującymi duże liczby.

Jeśli trzeba od czasu do czasu uzyskać sumę, to lepiej jest utworzyć pole modelu i dodać wartość przy zapisie.

Jeśli musisz zaktualizować ją w większości przypadków, zwykle otrzymanie wartości z połączenia (druga metoda) jest bardziej trafne.