使用模型ID列表调用django rest API

时间:2015-07-07 20:08:13

标签: django django-rest-framework

我试图找出使用这些模型ID列表查询特定模型的端点的最佳方法。我知道我可以使用url中的id查询详细信息端点(/ markers / {id}),但我希望能够一次发布多个ID并从模型实例接收带有这些ID的数据。截至目前,我创建了一个自定义APIView,如下所示(MarkerDetailsList),我基本上只发布一个id列表并定义一个自定义post方法来解析和查找db中的id,但我发现很难相信这是实现这一目标的最佳方式。有没有办法使用viewset实现相同的功能?我检查过文档并四处搜索,似乎找不到任何东西。有什么建议吗?

class MarkerViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.AllowAny]
    authentication_classes = ()
    queryset = Marker.objects.all()
    serializer_class = MarkerSerializer

class MarkerDetailList(APIView):
    queryset = Marker.objects.all()
    serializer_class = MarkerSerializer
    permission_classes = [permissions.AllowAny]
    authentication_classes = (JSONWebTokenAuthentication, )

    def post(self, request):
        ids = request.data['mapIds']
        markers = Marker.objects.filter(id__in=ids)
        serializer = MarkerSerializer(markers, many=True)
        return Response(serializer.data)

1 个答案:

答案 0 :(得分:3)

您可以使用FilterFilterSet。 (写了部分代码,然后找到https://stackoverflow.com/a/24042182/2354734

class ListFilter(django_filters.Filter):
    def filter(self, qs, value):
        if value not in (None, ''):
            integers = [int(v) for v in value.split(',')]
            return qs.filter(**{'%s__%s'%(self.name, self.lookup_type):integers})
        return qs  

class MarkerFilter(django_filters.FilterSet):
    ids = django_filters.NumberFilter(name="id", lookup_type='in')

    class Meta:
        model = Marker
        fields = ['ids']

class MarkerViewSet(viewsets.ModelViewSet):
    queryset = Marker.objects.all()
    serializer_class = MarkerSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = MarkerFilter

现在检索/ markers /?ids = 1,2,3,4