2012-07-12 25 views
5

Tôi có một câu hỏi nhanh. Tôi đang cố gắng thêm một trường vào một mô hình là tổng của 2 trường.Django @staticmethod tổng của hai trường

Ví dụ:

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

tôi nghĩ tôi chỉ có thể thêm một @staticmethod bên trong mô hình:

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

Nhưng tôi dường như không thể truy cập vào các lĩnh vực "fee_total" của mô hình sử dụng:

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

Bất kỳ ý tưởng nào tôi đang làm sai?

Cheers

+0

Bạn đã thử _total = model.fee_total() _ note missing '()' trong mã của bạn chưa. – Rohan

Trả lời

5

Tôi nghĩ rằng bạn muốn thêm một phương pháp để mô hình của bạn để https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods điều này có thể giúp bạn.

@staticmethod là trang trí khai báo phương thức cho số class, vì vậy sự khác biệt là gì?

Câu chuyện dài ngắn, phương pháp tĩnh không có trường hợp đối tượng cụ thể nào chỉ là một đối tượng cho đối tượng class, ý của đối tượng class, hầu hết mọi thứ trong python như hàm, lớp và tất nhiên đối tượng đang thực sự đối tượng ...

Giống như tất cả mọi người đã đề cập trước đây @property là một trang trí cho phép một hành động phương pháp như biến ... vì vậy bạn không cần phải sử dụng một cách rõ ràng ()

eitherway, bạn sẽ muốn làm điều này:

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

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

mặc dù các tài liệu có một cách tiếp cận dài hơn:

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) 

cả hai phương pháp được khá nhiều tương đương mặc dù chúng tôi sử dụng trang trí như một ngắn tay.

hy vọng điều này sẽ hữu ích.

+0

cảm ơn tất cả các bạn trả lời guys, điều này là rõ ràng nhất .. Chúc mừng! –

2

Từ cách tương tác của bạn với ví dụ mô hình của bạn, tôi tin rằng bạn thực sự muốn sử dụng @property trang trí thay thế.

0

Bạn cần gọi điều này bằng cách chuyển trường hợp dưới dạng thông số như dưới đây.

total = model.fee_total(model) 

Phương pháp tĩnh không vượt qua ngụ ý self làm thông số mẫu.

Tuy nhiên, như 'Filip Dupanović' gợi ý bạn có thể muốn sử dụng @property thay vì @staticmethod

Các vấn đề liên quan