2013-06-28 41 views
3

我有一个可以用longitudelatitude参数调用的视图。在Django Rest Framework中动态添加字段generics.ListAPIView

当这些参数被设置时,我想让响应添加序列化中的距离字段。

这是我如何做到这一点:

def get_queryset(self): 
    latitude = self.request.QUERY_PARAMS.get('latitude', None) 
    longitude = self.request.QUERY_PARAMS.get('longitude', None) 
    if latitude and longitude: 
     center = fromstr('POINT(%s %s)'%(latitude,longitude)) 
     queryset = queryset.distance(center).order_by('distance') 
     self.serializer_class.distance = serializers.CharField(source='distance') 
     self.serializer_class.Meta.fields += ('distance',) 
    return queryset.all() 

我想我可以有差异,这样做,有两个独立的serializer_class

我想知道如果它会更好,你怎么看?

+0

惠特这些行 'self.serializer_class.distance = serializers.CharField(source ='distance') self.serializer_class.Meta.fields + =('distance',)' – avances123

回答

1

我猜distanceNone其中longitudelatitude没有给出?

我倾向于定义序列化程序本身的距离字段,而不是在视图上动态添加它。

对于距离为None的情况 - 如果我不希望它在响应中 - 我将覆盖序列化程序中的to_native以将其删除。 E.g:

def to_native(self, obj): 
    ret = super(MySerializer, self).to_native(obj) 
    if ret['distance'] is None:   
     del ret['distance'] 
    return ret 

最终的结果是相同的,但这种做法是比较凝聚力。我希望有所帮助。

相关问题