在Django Rest Framework generics.ListAPIView中动态添加字段

时间:2013-06-28 18:10:32

标签: geodjango django-rest-framework

我有一个可以使用longitudelatitude参数调用的视图。

设置这些参数后,我希望响应在序列化中添加距离字段。

我是这样做的:

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

我想知道它会不会更好,您怎么看?

1 个答案:

答案 0 :(得分: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

最终结果是相同的,但这种方法更多是内聚。我希望有所帮助。