【问题标题】:Adding Filter to Django REST API将过滤器添加到 Django REST API
【发布时间】:2025-12-31 08:35:06
【问题描述】:

我对 Django 和 REST 很陌生,我希望能够指定一个值并让 REST api 只返回满足该值的行。有点像 sql select * from exampleTBL where id = 1 然后返回第一行。但这将通过 url:www.website/api/tmpHost/?id=1 完成,然后通过 REST API 返回第一行

我的看法是这样的:

class tmp_HostList(APIView):
    def get (self, request, format=None):
        tmp_hosts = tmp_Host.objects.all()
        serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request})
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = tmp_HostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的网址看起来像:

url(r'^api/tmpHost/$', views.tmp_HostList.as_view()),

我的序列化器看起来像:

class tmp_HostSerializer(DynamicFieldsMixin,  serializers.ModelSerializer):
    class Meta:
        model = tmp_Host
        fields = '__all__'

我该怎么做呢?我在这里看到了解决方案,但它们似乎对我不起作用。我使用 APIView 和我的序列化程序行的区别是:serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request}),而他们的区别很简单:serializer = tmp_HostSerializer

【问题讨论】:

    标签: django django-views django-rest-framework


    【解决方案1】:

    最简单的方法就是检查get参数,并通过参数返回过滤后的对象:

    from django.shortcuts import get_object_or_404
    
    class tmp_HostList(APIView):
    
        def get (self, request, format=None):
            param = request.GET.get('id')
            if param:
                tmp_host = get_object_or_404(Host, id=param)
                serializer = tmp_HostSerializer(tmp_host)
            else:
                tmp_hosts = tmp_Host.objects.all()
                serializer = tmp_HostSerializer(tmp_hosts, many=True)
            return Response(serializer.data)
    

    还内置了通用视图和视图集的过滤doc link
    但最好的选择是为详细信息页面创建单独的视图或使用视图集/通用视图。
    因此,您的视图保持不变,并为详细信息页面添加一个新视图。
    网址:
    url(r'^api/tmpHost/(?P<id>\d+)$', views.tmp_HostList.as_view())
    意见:

    class tmp_HostDetail(APIView):
    
        def get (self, request, id=None, format=None):
            tmp_host = get_object_or_404(Host, id=id)
            serializer = tmp_HostSerializer(tmp_host)
            return Response(serializer.data)
    

    【讨论】:

    • 你从哪里得到变量 'q' 或者应该被过滤器替换?
    • @JustinBraham 应该是param。我犯了一个错误