2012-05-21 10 views

Odpowiedz

14

Należy określić wszystkie pola w faktycznym źródle ModelResource, a następnie zastąpić metodę get_list, aby odfiltrować tylko te pola, które mają być wyświetlane. Zobacz wewnętrzną implementację get_list na Resource, aby zobaczyć, jak ją przesłonić.

Należy jednak zauważyć, że będzie to miało zastosowanie tylko w przypadku żądań GET, nadal powinieneś mieć możliwość POST/PUT/PATCH na zasobie ze wszystkimi polami, jeśli pozwalają na to ograniczenia autoryzacji.

W powłoce orzecha, chcesz poprawić listę wewnętrznych pól, zanim zostanie wywołana funkcja full_dehydrate na wszystkich obiektach ORM zwróconych przez obj_get_list.

Alternatywnie, możesz pozwolić, aby mechanizm pełnego odwodnienia miał miejsce, a na samym końcu usuń te pola, których nie chcesz pokazać, jeśli nie zależy Ci na wyciskaniu jak największej prędkości. Oczywiście musisz to zrobić tylko wtedy, gdy URL jest wywoływany w wyniku wywołania get_list. Istnieje metoda wygodna dla tego alter_list_data_to_serialize(request, to_be_serialized).

Wystarczy zrobić:

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

To jest dobry pomysł, a ja doceniam twoją odpowiedź. Zastanawiam się jednak, czy istnieje sposób na odłożenie pól z pierwotnego zapytania, aby uniknąć wysyłania dość dużych pól przez przewód. – Carson

+1

Proponuję Ci po prostu utworzyć 2 zasoby, takie, które pokazują wszystkie pola i inne, które pokazuje tylko twój podzbiór na tym samym modelu. Jest to najprostszy sposób bez większego nadmiaru. Jeśli nalegasz na to, że jest to ten sam zasób, możesz postępować zgodnie z moimi początkowymi zaleceniami dotyczącymi przeciążania get_list, aby uwzględnić tylko podzbiór pól podczas pobierania z ORM i serializacji. – astevanovic

+3

Powinny być "del obj.data [nazwa pola]". – Mitar

18

Możesz również teraz użyć atrybutu use_in na polu, aby określić odpowiedni zasób do wyświetlenia pola. Może to być list lub detail lub wywołanie zwrotne.

+2

To powinna być główna odpowiedź. O wiele bardziej oczywiste i jasne niż nadrzędne metody. – Radagast

+0

Jest to jeden z tych przypadków, w których powinieneś być w stanie zmienić "Zatwierdzoną" odpowiedź dla tych z nas, którzy przyjdą później na imprezę. –

0

Można również użyć metody odwodnienia (self, wiązka).

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

Powiązane problemy