Serializer

Jeong Ha Seung·2022년 1월 11일

django 객체를 가지고 있고 이것들을 JSON으로 바꿔주고 싶을 경우

꼭 JSON으로 serializer 시켜야 한다.

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/v1/rooms/", include('rooms.urls')),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

config/urls.py에서 path("api/v1/rooms/", include('rooms.urls')),로 수정

THIRD_PARTY_APPS = ["rest_framework"]

django-restframework 설치 후에 config/settings.py에서
THIRD_PARTY_APPS = ["rest_framework"] 👉 rest_framework 추가

from rest_framework.decorators import api_view
from rest_framework.response import Response

# Create your views here.


@api_view(["GET", "DELETE"])
def list_rooms(request):
    return Response()

rooms/views.py에서 api_view를 불러온 후에 /api/v1/rooms/list로 들어가보면

위와 같이 나온다.

rooms/views.py를 수정해서

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Room
from .serializers import RoomSerializer

# Create your views here.


@api_view(["GET", "DELETE"])
def list_rooms(request):
    rooms = Room.objects.all()
    serialized_rooms = RoomSerializer(rooms)
    return Response(data=serialized_rooms.data)

위와 같이 하면 AttributeError at /api/v1/rooms/list/ Got AttributeError when attempting to get a value for field nameon serializerRoomSerializer. The serializer field might be named incorrectly and not match any attribute or key on the QuerySet instance. Original exception text was: 'QuerySet' object has no attribute 'name'. 라는 오류가 나오는데,

serializer는 Room list를 이해하지 못하며, Room 자체를 이해한다.

many=True를 이용하여 문제를 해결할 수 있다.

serialized_rooms = RoomSerializer(rooms, many=True)

ModelSerializer

from rest_framework import serializers


class RoomSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=140)
    price = serializers.IntegerField()
    bedrooms = serializers.IntegerField()
    instant_book = serializers.BooleanField()

여기서 model에 있는 것들을 일일이 다 serializers.xxx 하기는 귀찮은 작업이다.

그래서 ModelSerializer라는 것을 이용하면 손쉽게 model을 JSON 객체로 바꿀 수 있다.

코드 변경

class RoomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Room
        fields = ("name", "price", "instant_book","user")

이렇게 하면 user가 int형태로 나오게 되는데 우리는 마치 preview 같이 나오게 하고 싶다.

따라서, users 폴더 내에 serializers.py 생성 후

from rest_framework import serializers
from .models import User


class TinyUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("username", "superhost")

위와 같이 작성한다. 그 다음에,

RoomSerializers 클래스 안에

user = TinyUserSerializer()로 선언하면 끝

0개의 댓글