2017-06-29 7 views
2

DjangoとRESTの新機能です。値を指定し、REST APIがその値が満たされている行だけを返すようにしたいと考えています。 SQLのようなselect * from exampleTBL where id = 1し、最初の行が返されます。しかし、それは、URLを介して行うことになります。Django REST APIにフィルタを追加する

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

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は次のようになります。最初の行は

私のビューが見えるREST APIを通じて返されwww.website/api/tmpHost/?id=1とt編私のシリアライザは次のようになります:

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

答えて

0

最も簡単な方法は、ちょうど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:
url(r'^api/tmpHost/(?P<id>\d+)$', views.tmp_HostList.as_view())
ビュー:あなたは、変数「Q」を取得またはフィルタによって置き換えられることになっていることであるでした

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) 
+0

? –

+0

@JustinBrahamそれは 'param'でなければなりません。私は間違いをする –

関連する問題