Django REST frameworkでパラメータを取得する

Django
スポンサーリンク
language

この記事ではDjango REST frameworkが推奨するパラメータの取得方法や、用途によって使用するrequest関数をご紹介します。

スポンサーリンク

GETリクエスト時にパラメータを取得

ajaxでDjango REST frameworkにGETリクエストをした場合、パラメータの取得方法は2つあります。

  • request.GET
  • request.query_params
Requests - Django REST framework
Django, API, REST, Requests

この2つの動作は同じですが、Django REST frameworkではrequest.query_paramsの使用を推奨しているのでできる限りrequest.query_paramsを使いましょう。

For clarity inside your code, we recommend using request.query_params instead of the Django’s standard request.GET.

https://www.django-rest-framework.org/api-guide/requests/#query_params

request.query_paramsにはGETリクエストだけでなくクエリパラメータが含まれる場合があります。

from rest_framework import viewsets, generics, status
from rest_framework.response import Response
from apps.products.models import Product


class ProductViewSet(viewsets.ModelViewSet):
    def list(self, request):
          products = Product.objects.filter(
              name__icontains=request.query_params.get('name')
          )
          ...
          return Response({"products": products}, status=status.HTTP_201_CREATED)

POST時にパラメータを取得

ajaxでDjango REST frameworkにPOST(またはPUTPATCH)した場合、パラメータの取得方法は2つあります。

  • request.POST
  • request.data
2 - Requests and responses - Django REST framework
Django, API, REST, 2 - Requests and responses

request.POST

request.POSTはフォームデータのみのデータが辞書形式で格納されています。

使い方はDjangoと同じです。

from rest_framework import viewsets, generics, status
from rest_framework.response import Response


class ProductViewSet(viewsets.ModelViewSet):
    def create(self, request):
          title = request.POST.get('title')
          ...
          return Response({"title": title}, status=status.HTTP_201_CREATED)

request.data

request.dataはJSONデータPOST(またはPUTPATCH)されたときに使います。

辞書形式で格納されています。

from rest_framework import viewsets, generics, status
from rest_framework.response import Response


class ProductViewSet(viewsets.ModelViewSet):
    def create(self, request):
          data = request.data
          title = data["title"]
          ...
          return Response({"title": title}, status=status.HTTP_201_CREATED)
タイトルとURLをコピーしました