DRFフレームのフィルタ機能

2566 ワード

今日初めてdrfフレームワークで粗末なバックグラウンドを書きましたが、フロントバックグラウンドの分離開発を初めて試み、インタフェースのデバッグがほぼ完了しました.このアプリケーションの作成を通じて、DRFフレームワークの強さも徐々に認識され、例えば今日またフィルタリングに関する新しい姿勢を学びました!
ところで、前にフィルタリングを書いたのは同じです.例えば、
def get_object(self):
    return Book.objects.filter(author__pk=1)

平凡な顔をしているのではないでしょうか.勉強を始めたばかりの頃はずっとそう書いていましたが、前に理解が足りなかった場合でも、そう書くしかありませんでした.
def get_object(self):
    return Book.objects.filter(name='    ')

このように、現在のエンドでクエリーをしたい場合はバックグラウンドでパラメータを解析し、異なるクラスに対してフィルタリングが必要な場合は、それぞれの場所にこのような段落を書かなければなりません.
def retrieve(request, *args, **kwargs)
    name = self.request.query_params.get('name', None)
    if name:
        book = Book.objects.filter(name=name).first()
        serializer = BookSerializer(book, many=False)
        serializer.valid(raiseException=True)
        return Response(serializer.data)
    else:
        raise BadRequestError('error')

長老が長くなったように見えますが、まだ無効なコードです.その後、人のコードを見て、公式サイトでもう一度見てみると、フィルターというものがあった!Django_をインストールする必要がある場合は、ビュークラスにコードを1行追加すればOKです.filter、コードは次のようになります.
from rest_framework import mixins, viewsets, filters
from django_filters.rest_framework import DjangoFilterBackend

class BookViewSet(viewsets.GenericViewSet,
                     mixins.CreateModelMixin,
                     mixins.UpdateModelMixin,
                     mixins.DestroyModelMixin,
                     mixins.RetrieveModelMixin,
                     mixins.ListModelMixin):
    queryset = Book.objects.all()
    filter_backends = (DjangoFilterBackend, filters.SearchFilter)
    filter_fields = ('name', 'author__id')

そしてあなたは直接通過することができますhttp://baseurl/api/book?name=三国演義あるいはhttp://baseurl/api/book?author__id=1訪問に来て、もちろん聡明であなたもきっと後の_を思い付きましたようですid削除、フロントエンドは何が必要なのか自分で補う_OKです.強いのではないでしょうか.age_のような比較方法を使うこともできますgt=3これは、あなたのfilter_fieldsが入力したフィールドは正しいので、フロントエンドがパラメータを間違えても大丈夫であれば、後ろの部分がなければいいです.とても便利に使えたと言えます.
もっと高級な使い方をしたいならどうしますか?答えはfilterSetを使用してカスタマイズできることです.
class GoodsFilter(django_filters.rest_framework.FilterSet):
    min_price = django_filters.NumberFilter(name='shop_price', lookup_expr='gt')

    class Meta:
        model = Goods
        fields = ['min_price']

これにより、ビュー関数でこのフィルタを使用できます.
from .filters import GoodsFilter

class xxView(xxxView):
    filter_class = GoodsFilter

この2行のコードで、1つのビュー関数が完成しましたが、先端から見ると、依然として前の効果とフィールドで、とても皮が生えているのではないでしょうか.
フィルタと並べて並べ替えたりグループ化したりして、その形式はこれと似ています.また別の日にしましょう.