2014-11-03 30 views
1

什麼是改變Django Rest Framework的默認模型串行器返回的JSON結構的好方法?將字段包含到其他JSON對象中

示例 -

這是由DRF現在返回

餐廳對象:

{ 
    "id":9, 
    "label":"Pizza Hut" 
    "like_id:":32, 
    "like_quantity":2 
} 

尤佳的JSON結構:

{ 
    "id":9, 
    "label":"Pizza Hut", 
    "social": { 
     "like_id:":32, 
     "like_quantity":2 
    } 
} 

爲了使JSON結構,我想很少從田地默認的JSON嵌套在新的字段下。

回答

1

更好的解決方案對我是在你的Serializer使用SerializerMethod。例如:

class RestaurantSerializer(serializers.ModelSerializer): 
    id = serializers.IntegerField(source='id')  
    label = serializers.CharField(source='label') 
    social = serializers.SerializerMethod(method_name='pick_social_fields') 

    def is_restaurant_liked(self, restaurant): 
     # some logic here 
     return is_liked 

    def pick_social_fields(self, restaurant): 
     like_id = self.is_restaurant_liked(restaurant) 
     like_quantity = restaurant.like_set.count 
     return { 
      'like_id': like_id, 
      'like_quantity': like_quantity 
     }  

該解決方案更適合我,因爲你不必重寫DRF查看任何東西。你只需要在Serializer類中定義一個方法。

1

如果我得到你的權利,你想這樣:

{ 
    "id":9, 
    "label":"Pizza Hut", 
    "social": { 
     "like_id:":32, 
     "like_quantity":2 
    } 
} 

是GET請求的結果。

您可以編輯返回值的通用視圖中,如果您正在使用一個,例如:

class RestaurantViewSet(mixins.RetrieveModelMixin, 
        viewsets.GenericViewSet): 

    queryset = Restaurant.objects.all() 
    serializer_class = RestaurantSerializer 

    def retrieve(self, request, pk=None): 
     queryset = Restaurant.objects.all() 
     restaurant = get_object_or_404(queryset, pk=pk) 
     serializer = RestaurantSerializer(user,context={'request': request}) 
     results = { 
        "id":serializer.data['id'], 
        "label":serializer.data['label'], 
        "social": { 
         "like_id:":serializer.data['like_id'], 
         "like_quantity":serializer.data['like_quantity'] 
           } 
        } 
     return Response(results) 
+0

謝謝,但這看起來有點'哈克'。我製作了我自己的解決方案(請參閱下文)。再次感謝。 – 2014-11-03 09:19:26

相關問題