向Django REST API添加过滤器

向Django REST API添加过滤器,django,django-views,django-rest-framework,Django,Django Views,Django Rest Framework,我是Django和REST的新手,我希望能够指定一个值,并让RESTAPI只返回满足该值的行。有点像sqlselect*from exampleTBL,其中id=1,然后返回第一行。但这将通过url完成:www.website/api/tmpHost/?id=1,然后通过REST api返回第一行 我的观点是: class tmp_HostList(APIView): def get (self, request, format=None): tmp_hosts = tm

我是Django和REST的新手,我希望能够指定一个值,并让RESTAPI只返回满足该值的行。有点像sql
select*from exampleTBL,其中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__'
我的url看起来像:

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__'
我的序列化程序看起来像:

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\u HostSerializer(tmp\u hosts,many=True,context={'request':request})
虽然他们的方法很简单,比如:
serializer=tmp\u HostSerializer

最简单的方法就是检查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)
还有内置的通用视图和视图集过滤功能
但最好的选择是为详细信息页面创建单独的视图或使用视图集/常规视图。
因此,您的视图将保持不变,并为详细信息页面添加一个新视图。
URL:
url(r'^api/tmpHost/(?P\d+)$,views.tmp_HostList.as_view())

观点:


你是从哪里得到变量“q”的,还是应该用过滤器来代替它?@JustinBraham它应该是
param
。我犯了一个错误