2012-05-21 13 views

Trả lời

14

Bạn sẽ phải chỉ định tất cả các trường trong ModelResource thực tế sau đó ghi đè phương thức get_list để lọc ra chỉ các trường bạn muốn hiển thị. Xem triển khai nội bộ của get_list trên Resource để xem cách ghi đè. Tuy nhiên, lưu ý điều này sẽ chỉ áp dụng cho các yêu cầu GET, bạn vẫn có thể POST/PUT/PATCH trên tài nguyên với tất cả các trường nếu giới hạn ủy quyền cho phép bạn làm như vậy.

Trong vỏ hạt, bạn muốn vá nóng danh sách trường nội bộ trước khi full_dehydrate được gọi trên tất cả các đối tượng ORM được trả lại bởi obj_get_list.

Ngoài ra, bạn có thể để cơ chế khử nước đầy đủ diễn ra và chỉ ở cuối của nó loại bỏ các trường bạn không muốn hiển thị nếu bạn không quan tâm đến việc ép ra càng nhiều càng tốt. Tất nhiên bạn sẽ cần phải làm điều này chỉ khi URL được gọi là kết quả của cuộc gọi get_list. Có một phương pháp tiện lợi cho số alter_list_data_to_serialize(request, to_be_serialized) này.

Chỉ cần làm:

class SomeResource(Resource): 
    class Meta(...): 
     ... 
     field_list_to_remove = [ 'field1', 'field2' ] 
     ... 

    def alter_list_data_to_serialize(request, to_be_serialized): 
     for obj in to_be_serialized['objects']: 
      for field_name in self._meta.field_list_to_remove: 
       del obj.data[field_name] 
     return to_be_serialized 
+0

Đây là một ý tưởng hay và tôi đánh giá cao câu trả lời của bạn. Tôi tự hỏi, mặc dù, nếu có một cách để trì hoãn các lĩnh vực từ truy vấn ban đầu để tránh gửi một số lĩnh vực khá lớn trên dây. – Carson

+1

Sau đó, tôi sẽ đề nghị bạn chỉ cần tạo 2 tài nguyên, một tài nguyên hiển thị tất cả các trường và một trường khác chỉ hiển thị tập hợp con của bạn trên cùng một mô hình. Đó là cách đơn giản nhất mà không tốn nhiều chi phí. Nếu bạn nhấn mạnh vào nó là cùng một tài nguyên, bạn có thể làm theo đề nghị ban đầu của tôi về quá tải get_list để chỉ bao gồm tập hợp con của các trường khi tìm nạp chúng từ ORM và tuần tự hóa chúng. – astevanovic

+3

Sẽ có 'del obj.data [field_name]'. – Mitar

18

Bạn cũng có thể sử dụng thuộc tính use_in trên một trường để chỉ định tài nguyên có liên quan để hiển thị trường. Đây có thể là list hoặc detail hoặc gọi lại.

+2

Đó phải là câu trả lời chính. Rõ ràng hơn và rõ ràng hơn các phương pháp ghi đè. – Radagast

+0

Đây là một trong những trường hợp mà bạn sẽ có thể thay đổi câu trả lời "Được chấp thuận" cho những người trong chúng ta sẽ đến sau bữa tiệc. –

0

Cũng có thể sử dụng phương pháp khử nước (tự, bó).

def dehydrate(self, bundle): del bundle.data['attr-to-del] return bundle

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