2012-05-21 83 views

回答

14

你將不得不在實際ModelResource指定的所有字段,然後重寫get_list方法來過濾出你想顯示的字段。請參閱get_list的內部實現Resource以瞭解如何覆蓋它。

但是,請注意,這隻會對GET請求應用,你仍然應該能夠發佈對資源/ PUT/PATCH所有領域,如果你的授權限制,您可以這樣做。

在堅果殼中,您希望在對由obj_get_list返回的所有ORM對象調用full_dehydrate之前熱修補內部字段列表。

或者,您可以讓完全脫水機制發生,只是在它的結尾處,刪除你不希望顯示,如果你不關心儘可能多壓榨​​出的速度儘可能的字段。當然,只有在由於get_list調用而調用URL時,您才需要執行此操作。這個alter_list_data_to_serialize(request, to_be_serialized)有一個方便的方法。

只要做到:

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

這是一個好主意,我很感謝你的回答。不過,我想知道是否有辦法延遲原始查詢中的字段,以避免通過網絡發送一些相當大的字段。 – Carson

+1

然後我會建議你簡單地創建2個資源,一個顯示所有字段,另一個只顯示你的子集在同一個模型上。這是沒有太多開銷的最簡單的方法。如果你堅持認爲它是相同的資源,那麼你可以按照我最初的建議來重載get_list,以便在從ORM獲取它們並序列化它們時只包含你的字段的子集。 – astevanovic

+3

應該有'del obj.data [field_name]'。 – Mitar

18

您現在還可以使用字段中的use_in屬性來指定相關資源以顯示該字段。可以是listdetail或回調。

+2

這應該是主要答案。比壓倒一切的方法更加明顯和清晰。 – Radagast

+0

這是其中一種情況,您應該能夠更改晚會參加派對的「已批准」答案。 –

0

也可以使用脫水(自我,捆綁)方法。

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

相關問題