2017-05-11 24 views
0

私はすべての家賃と投稿と削除などを表示するためのAPIViewクラスを持っています。今私はDjangoFilterBackendを使用しようとしましたが、動作しません。私はドキュメントでそれがListAPIViewで使用されているのを見ていますが、APIViewでどのように使用できますか?私は、URLに次のパラメータを使用して家賃を検索するとき、私はすべての賃料を取得し、代わりに私が都市カトマンズにあるものだけ家賃を取得し、koteshworAPIViewのdjangoフィルター

http://localhost:8000/api/v1/rents?city=Kathmandu&place=Koteshwor

+0

このビューの目的はオブジェクトのリストを返すように見えるので、 'ListAPIView'ですか? – ChidG

+0

私はこのビューのすべてを削除、更新、削除しました。また、ListAPIViewとRetrieveAPIViewではなく、1つの家賃を表示​​するか、1つのget関数ですべての家賃を行っています。 – Serenity

+0

DRFの機能を複製しました。ビューセット – ChidG

答えて

1

あなたがAPIViewを使用している場合は、次に

get_data = request.query_params #or request.GET check both 

Rental.objects.filter(city=get_data['city'], place=get_data['place']) 
ようにしなければならないfilters.Soとは何の関係はありません
+0

私はListAPIViewでもできるが、これもどちらか良い。 – Serenity

+0

フィルタリングのために 'ListAPIView'を使用している場合、' drf'はこのdjango ORMアプローチをとにかく使っています。 – itzMEonTV

+0

私がAPIViewを好んでいるのは、すべてを手作業で行う必要があるからです。これは私が概念をますます学ぶのに役立ちます。私はあなたが私に見せたやり方でやった。ご協力いただきありがとうございます。もう1つの質問ですが、rest_frameworkのsetup_eager_loadingについて知っていますか? – Serenity

3

を置くべき

class Rent(APIView): 
    """ 
    List all the rents if token is not provided else a token specific rent 
    """ 
    serializer_class = RentSerializer 
    filter_backends = (DjangoFilterBackend,) 
    filter_fields = ('city', 'place', 'property_category',) 
    search_fields = ('=city', '=place') 
    def get(self, request, token=None, format=None): 
     reply={} 
     try: 
      rents = Rental.objects.all() 
      if token: 
       rent = Rental.objects.get(token=token) 
       reply['data'] = self.serializer_class(rent).data 
      else: 
       reply['data'] = self.serializer_class(rents, many=True).data 
     except Rental.DoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 
     except: 
      return error.UnknownError().as_response() 
     else: 
      return Response(reply, status.HTTP_200_OK) 

DjangoFilterBackendの機能を使用するには、GenericViewSetfilter_querysetメソッドを組み込むことができます。これはAPIViewから継承し、DRFのすべての特定の「汎用」ビュークラスにつながるDRFクラスです。それは次のようになります。ここでは

def filter_queryset(self, queryset): 
    """ 
    Given a queryset, filter it with whichever filter backend is in use. 
    You are unlikely to want to override this method, although you may need 
    to call it either from a list view, or from a custom `get_object` 
    method if you want to apply the configured filtering backend to the 
    default queryset. 
    """ 
    for backend in list(self.filter_backends): 
     queryset = backend().filter_queryset(self.request, queryset, self) 
    return queryset 

https://github.com/encode/django-rest-framework/blob/master/rest_framework/generics.py

+0

なぜ否定的な投票が行われるのですか? – Serenity

+0

私は同じことを思っていた;) – ChidG

関連する問題