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)
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()로 선언하면 끝