【问题标题】:Call django rest API with list of model ids使用模型 ID 列表调用 django rest API
【发布时间】:2015-09-25 12:24:51
【问题描述】:

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

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)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以为此使用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 上检索时

    【讨论】:

    • 如果不使用ListFilter,为什么会在那里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多