2012-07-12 14 views
5

Mam krótkie pytanie. Próbuję dodać pole do modelu, który jest sumą 2 pól.Django @staticmethod suma dwóch pól

Na przykład:

class MyModel(models.Model) 
     fee = models.DecimalField() 
     fee_gst = models.DecimalField() 

Myślałem, że mogę tylko dodać @staticmethod wewnątrz modelu

@staticmethod 
def fee_total(self): 
    return self.fee + self.fee_gst 

Ale nie mogę wydawać się aby uzyskać dostęp do „fee_total” pole modelu użycie:

model = MyModel.objects.get(pk=1) 
total = model.fee_total 

Jakieś pomysły, co robię źle?

Cheers

+0

Czy próbowałeś _total = model.fee_total() _ uwaga brakuje "()" w kodzie. – Rohan

Odpowiedz

5

myślę chcesz dodać metodę do modelu więc https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods może pomóc.

@staticmethod to dekorator, który deklaruje metodę dla class, więc jaka jest różnica?

Krótko mówiąc, metody statyczne nie mają instancji do żadnego konkretnego obiektu, tylko instancja do obiektu class, co mam na myśli przez obiekt class, większość rzeczy w pythonowych funkcjach, klasie i oczywiście instancjach obiekty są faktycznie obiektów ...

jak każdy wspomniał przed @property jest dekorator, który pozwala aktu Sposób według zmiennej ... więc nie trzeba jawnie użyć ()

Eitherway, co chcesz zrób to:

class MyModel(models.Model) 
    fee = models.DecimalField() 
    fee_gst = models.DecimalField() 

    @property   
    def fee_total(self): 
     return self.fee + self.fee_gst 

chociaż docs potrwać dłużej podejście:

class MyModel(models.Model) 
    fee = models.DecimalField() 
    fee_gst = models.DecimalField() 


    def _fee_total(self): 
     return self.fee + self.fee_gst 
    fee_total = property(_fee_total) 

obie metody są prawie równoważne choć używamy dekoratora jako krótki ręki.

mam nadzieję, że to pomoże.

+0

dzięki za wszystkie odpowiedzi chłopaki, ten był najbardziej jasny .. Pozdrawiam! –

2

od drogi swojej interakcji z instancji modelu, wierzę, że rzeczywiście chcesz używać @property dekorator zamiast.

0

Musisz wywołać to, przekazując instancję jako parametr, jak poniżej.

total = model.fee_total(model) 

Metoda statyczna nie przechodzi niejawnego self jak np parametru.

Jednakże, jak „” Filip Dupanović zasugerował może chcesz używać @property zamiast @staticmethod