DRFフレームのフィルタ機能
2566 ワード
今日初めてdrfフレームワークで粗末なバックグラウンドを書きましたが、フロントバックグラウンドの分離開発を初めて試み、インタフェースのデバッグがほぼ完了しました.このアプリケーションの作成を通じて、DRFフレームワークの強さも徐々に認識され、例えば今日またフィルタリングに関する新しい姿勢を学びました!
ところで、前にフィルタリングを書いたのは同じです.例えば、
平凡な顔をしているのではないでしょうか.勉強を始めたばかりの頃はずっとそう書いていましたが、前に理解が足りなかった場合でも、そう書くしかありませんでした.
このように、現在のエンドでクエリーをしたい場合はバックグラウンドでパラメータを解析し、異なるクラスに対してフィルタリングが必要な場合は、それぞれの場所にこのような段落を書かなければなりません.
長老が長くなったように見えますが、まだ無効なコードです.その後、人のコードを見て、公式サイトでもう一度見てみると、フィルターというものがあった!Django_をインストールする必要がある場合は、ビュークラスにコードを1行追加すればOKです.filter、コードは次のようになります.
そしてあなたは直接通過することができますhttp://baseurl/api/book?name=三国演義あるいはhttp://baseurl/api/book?author__id=1訪問に来て、もちろん聡明であなたもきっと後の_を思い付きましたようですid削除、フロントエンドは何が必要なのか自分で補う_OKです.強いのではないでしょうか.age_のような比較方法を使うこともできますgt=3これは、あなたのfilter_fieldsが入力したフィールドは正しいので、フロントエンドがパラメータを間違えても大丈夫であれば、後ろの部分がなければいいです.とても便利に使えたと言えます.
もっと高級な使い方をしたいならどうしますか?答えはfilterSetを使用してカスタマイズできることです.
これにより、ビュー関数でこのフィルタを使用できます.
この2行のコードで、1つのビュー関数が完成しましたが、先端から見ると、依然として前の効果とフィールドで、とても皮が生えているのではないでしょうか.
フィルタと並べて並べ替えたりグループ化したりして、その形式はこれと似ています.また別の日にしましょう.
ところで、前にフィルタリングを書いたのは同じです.例えば、
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つのビュー関数が完成しましたが、先端から見ると、依然として前の効果とフィールドで、とても皮が生えているのではないでしょうか.
フィルタと並べて並べ替えたりグループ化したりして、その形式はこれと似ています.また別の日にしましょう.