2014-11-03 29 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

相关问题