2010-10-13 37 views
11

Sử dụng ví dụPython/Django: Thêm phương pháp mô hình tùy chỉnh?

class model(models.Model) 
    .... 
    def my_custom_method(self, *args, **kwargs): 
     #do something 

Khi tôi cố gắng gọi phương pháp này trong pre_save, tiết kiệm, post_save vv, Python đặt ra một TypeError; phương pháp không liên kết.

Làm cách nào để thêm phương thức mô hình tùy chỉnh có thể được thực hiện theo cùng cách như model.objects.get(), v.v ...?

Edit: cố gắng sử dụng super(model, self).my_custom_method(*args, **kwargs) nhưng trong trường hợp đó Python nói rằng mô hình không có thuộc tính my_custom_method

Trả lời

25

How are you gọi phương pháp này? Bạn đã xác định phương thức dụ, chỉ có thể được gọi trên một phiên bản của lớp, chứ không phải chính lớp đó. Nói cách khác, khi bạn có một phiên bản của model được gọi là mymodelinstance, bạn có thể làm mymodelinstance.my_custom_method().

Nếu bạn muốn gọi nó trên lớp, bạn cần phải xác định một lớp học. Bạn có thể làm điều này với trang trí @classmethod trên phương pháp của mình. Lưu ý rằng theo quy ước, tham số đầu tiên cho một lớp là cls, không phải là self. Xem the Python documentation để biết chi tiết về lớp học. Tuy nhiên, nếu những gì bạn thực sự muốn làm là thêm phương thức hoạt động cấp truy vấn, như objects.filter() hoặc objects.get(), thì tốt nhất là xác định Trình quản lý tùy chỉnh và thêm phương thức của bạn ở đó. Sau đó, bạn sẽ có thể thực hiện model.objects.my_custom_method(). Một lần nữa, hãy xem Django documentation về Người quản lý.

0

Nếu bạn đang thực hiện một tín hiệu cho mô hình của bạn, nó không nhất thiết chỉ cần được xác định trong lớp mô hình. Bạn có thể định nghĩa nó bên ngoài lớp và chuyển tên lớp làm tham số cho hàm kết nối.

Tuy nhiên, trong trường hợp của bạn, bạn cần đối tượng mô hình để truy cập phương thức.

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