2011-10-07 29 views
23

Sau khi đọc lên trên Trình quản lý Django, tôi vẫn không chắc chắn tôi sẽ nhận được bao nhiêu lợi ích khi sử dụng nó. Dường như cách tốt nhất là thêm các phương thức truy vấn tùy chỉnh (chỉ đọc) như XYZ.objects.findBy*(). Nhưng tôi có thể dễ dàng thực hiện điều đó bằng các phương thức tĩnh của chính lớp học Model.Sử dụng Trình quản lý Django so với staticmethod trên Lớp mô hình trực tiếp

tôi thích sau này luôn vì:

  1. đang trên địa bàn về khả năng đọc và bảo trì dễ dàng hơn
  2. hơi ít tiết như tôi không cần objects tài sản trong các cuộc gọi của tôi
  3. Manager lớp có các quy tắc kỳ lạ liên quan đến kế thừa mô hình, cũng có thể ở lại rõ ràng về điều đó.

Có lý do nào tốt không? không phải để sử dụng các phương pháp tĩnh và thay vào đó sử dụng lớp người quản lý?

Trả lời

28

Thêm truy vấn tùy chỉnh cho người quản lý là quy ước Django. Từ tài liệu Django trên custom managers:

Thêm phương thức quản lý bổ sung là cách ưa thích để thêm chức năng "mức bảng" vào mô hình của bạn.

Nếu đó là ứng dụng riêng tư của bạn, từ quy ước không quan trọng lắm - thực sự codebase nội bộ của công ty có một vài phân loại có thể thuộc về người quản lý tùy chỉnh.

Tuy nhiên, nếu bạn đang viết một ứng dụng mà bạn sẽ chia sẻ với người dùng Django khác, thì họ sẽ mong đợi được xem findBy trên trình quản lý tùy chỉnh.

Tôi không nghĩ rằng các vấn đề thừa kế bạn đề cập đến quá xấu. Nếu bạn đọc số custom managers and model inheritance docs, tôi không nghĩ bạn sẽ bị bắt. Verbosity viết .objects là chịu đựng được, chỉ vì nó là khi chúng ta làm các truy vấn sử dụng XYZ.objects.get()XYZ.objects.all()

Dưới đây là một vài lợi thế của việc sử dụng các phương pháp quản lý theo ý kiến ​​của tôi:

  1. Tính nhất quán của API. Phương thức của bạn findBy thuộc về get, filter, aggregate và các phương thức còn lại. Bạn muốn biết những gì bạn có thể thực hiện trên trình quản lý XYZ.objects? Thật đơn giản khi bạn có thể quan sát với dir(XYZ.objects).

  2. Phương pháp tĩnh "lộn xộn" không gian tên dụ. XYZ.findBy() là tốt nhưng nếu bạn xác định một phương pháp tĩnh, bạn cũng có thể làm xyz.findBy(). Chạy tra cứu findBy trên một cá thể cụ thể không thực sự hợp lý.

  3. Độ ẩm. Đôi khi bạn có thể sử dụng cùng một người quản lý trên nhiều mô hình.

Đã nói tất cả điều đó, tùy thuộc vào bạn. Tôi không biết lý do giết người tại sao bạn không nên sử dụng một phương pháp tĩnh.Bạn là người lớn, đó là mã của bạn và nếu bạn không muốn viết findBy làm phương thức của người quản lý, bầu trời sẽ không rơi vào;)

Để đọc thêm, tôi khuyên bạn nên đăng bài trên blog Managers versus class methods bởi James Bennett, người quản lý phát hành của Django.

+4

Cảm ơn alasdir, lời giải thích của bạn có ý nghĩa và liên kết bạn đã thêm rất hữu ích! – Xerion

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