diadia

興味があることをやってみる。自分のメモを残しておきます。

DRFチュートリアルを読んでわかったことをメモする

Tutorial 2: Requests and Responses

参照:https://www.django-rest-framework.org/tutorial/2-requests-and-responses/

RequestオブジェクトがDRFでは少し異なるらしい。
request.dataが使える。ResponseオブジェクトもDRFでは少し異なるらしい。return Response(data)のように使うらしい。

@api_viewはfunction based viewのためのもので、APIViewはclass-based viewのためのものである。@api_viewやAPIViewを使うとRequestオブジェクトもResponseオブジェクトも少々変わる。Responseオブジェクトに限って言えば、Responseオブジェクトにcotextを加えることができる。APIViewや@api_viewを使わなかった場合、contextを渡すことができない。以下の例はある。

 hoge_api/views.py


from django.http import JsonResponse
from django.views.generic import View
from items.models import Item
from hoge_api.serializers import ItemSerializer

class ItemListSerializerView(View):
    def get(self, request, *args, **kwargs):
        item_objects = Item.objects.all()
        serializer = ItemSerializer(item_objects, many=True)
        return JsonResponse(serializer.data, safe=False)

上記の例では、item_objectsのデータをすべてJsonResponseで表現することができる。しかしながらJsonResponseで返せるのはitem_objectsだけで、他のオブジェクト(例えば、Userオブジェクト)はJsonResponseの内容として返すことができない。つまりある特定の1種類のクエリ、またはオブジェクトしか返すことができないのがこのコードの弱点だとわかる。この弱点を克服し複数のクエリ、オブジェクトをJosnとして返す事ができるのが@api_viewやAPIViewである。

APIViewを使う理由がわかった。それはrest_framework.APIViewを使うとrest_framework.response.Responseを使えるようになることだ。これを使うと結果の表示がいい感じになる。これくらいしかわからないけどいいのか??