2016-09-06 20 views
6

Tôi đang làm việc với một số mô hình phải trả lại tổng số trường mô hình. Có tốt hơn để ghi đè lên phương thức lưu trên mô hình hay chỉ tạo một phương thức tùy chỉnh trả về tổng. Có bất kỳ vấn đề hiệu suất nào với một trong các giải pháp không?Mô hình Django, Ghi đè phương thức lưu hoặc phương thức tùy chỉnh với thuộc tính

Tùy chọn 1: Ghi đè phương thức lưu.

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) 

Lựa chọn 2: Phương pháp chỉnh

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

Trả lời

2

Câu trả lời phụ thuộc vào cách bạn sẽ sử dụng sum_integers. Nếu bạn giữ nó như một trường trong DB, bạn sẽ có thể thực hiện một truy vấn trên nó, và với thuộc tính nó sẽ rất phức tạp.

Mặt khác, nếu bạn không thực hiện truy vấn và dữ liệu này không có giá trị cho bạn (nói cách khác - bạn cần sum_integers làm đại diện dữ liệu) thì bạn nên đi với tài sản. Từ điểm thực hiện ứng dụng: Nếu bạn định thực hiện các thao tác phức tạp trên hàng nghìn đối tượng - có thể tốt hơn để lưu trữ giá trị trong cột hoặc ít nhất là thay đổi thuộc tính thành cached_property nếu nó được gọi một vài lần .

Giá trị lưu trữ tổng trong cột DB phổ biến hơn và không bị hạ cấp, nhưng trong một số trường hợp, phương pháp property cho phép bạn giữ mô hình dữ liệu sạch hơn và tiết kiệm không gian trên đĩa.

Tôi hy vọng đó là câu trả lời cho câu hỏi của bạn. Vui lòng điền miễn phí để đặt câu hỏi nếu có điều gì đó không rõ ràng.

+0

Cảm ơn, giải thích tốt về những ưu và khuyết điểm. – Andreas

2

Phụ thuộc vào việc bạn có phải cập nhật nhiều trường hơn hay gọi tổng số nhiều hơn.

Tôi giả định, để làm cho nó chung chung hơn, rằng hoạt động không chỉ là tính toán bổ sung mà còn phức tạp với số lượng lớn.

Nếu bạn phải nhận tổng số tiền ngay bây giờ, thì tốt hơn hết là tạo trường mô hình và thêm giá trị khi lưu.

Nếu bạn phải cập nhật phần lớn, sau đó thường nhận được giá trị khi gọi (phương pháp thứ hai) là thích hợp hơn.

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