2010-05-02 18 views

Trả lời

13

Có, bạn có thể ghi đè các phương pháp này. Có một cái nhìn tại blog post by Nick Johnson .Công lớp mô hình nối này trông này:

class HookedModel(db.Model): 
    def before_put(self): 
    pass 

    def after_put(self): 
    pass 

    def put(self, **kwargs): 
    self.before_put() 
    super(HookedModel, self).put(**kwargs) 
    self.after_put() 

Đọc blog để xem làm thế nào để xử lý các phương pháp db.put() quá.

Bạn cũng có thể quan tâm đến số "derived properties".

+5

Tôi thực sự phải nhanh hơn. ;) –

+0

put() phải trả về một khóa - Tôi đã gửi một bản chỉnh sửa cho câu trả lời này để thêm vào đó. – wodow

+0

@wodow, không * có thể chấp nhận để bạn chỉnh sửa mã của người khác để thêm mã của riêng bạn, đặc biệt là nếu đó là câu trả lời được chấp nhận *. Nếu bạn thực sự cảm thấy rằng bạn có điều gì đó để thêm, sau đó thêm câu trả lời của riêng bạn hoặc yêu cầu tác giả trả lời điều chỉnh mã của họ. Tôi đã khôi phục bản chỉnh sửa của bạn. – Sheridan

1

tôi đăng một phần mở rộng cho lớp HookedModel jbochi của sao cho before_putafter_put phương pháp được gọi một cách chính xác khi gọi từ db.put()_async gia đình của các chức năng.

Xem AppEngine PreCall API hooks

1

Tôi đã cố gắng để cải thiện khi các câu trả lời bằng @jbochi:

  1. Theo https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_put, put() phải trả lại một Key, vì vậy giá trị trả về từ thư viện nên được đi qua .
  2. db.Model.save(), trong khi không dùng nữa, là (a) đôi khi vẫn được sử dụng, (b) có nghĩa là một từ đồng nghĩa với put() và (c) dường như không được gọi trực tiếp bởi put() - vì vậy phải được xử lý thủ công.

tắc sửa đổi:

class HookedModel(db.Model): 
    def before_put(self): 
    pass 

    def after_put(self): 
    pass 

    def put(self, **kwargs): 
    self.before_put() 
    result = super(HookedModel, self).put(**kwargs) 
    self.after_put() 
    return result 

    def save(self, **kwargs): 
    self.before_put() 
    result = super(HookedModel, self).save(**kwargs) 
    self.after_put() 
    return result 

Bạn vẫn nên đọc http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models nếu bạn muốn sử dụng monkeypatching, hoặc câu trả lời Chris Farmiloe cho việc sử dụng các phương pháp async.

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