본문으로 바로가기

Django Restframework 정리

category Coding/Django 2018. 4. 20. 13:12
반응형

범위 : #1-29 Django Rest Framework Installation and Basic Concepts ~ #1-35 Hidden Model Fields in Django


1.

serializers.py는 쉽게 말해서 중간에 있는 미들웨어 역할이라고 보면 된다.

(JSON화 해준다고 생각하면 쉬울듯)

serializers를 사용하려면 최상단에 다음과 같이 import 해줘야 한다.


from rest_framework import serializers


또한 serialize할 모델도 불러와야 하므로 아래의 코드도 추가한다.


from . import models


그리고 작성하는 형식은 다음과 같다.

class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = models.Image
fields = '__all__'

여기서는 Image모델에 대한 시리얼라이즈를 만드는 것이므로 ImageSerializer라고 이름을 줬다.

serializers.ModelSerializer를 상속받아서 사용해야함을 잊지말자.

그 다음 Meta 클래스를 생성하고 model에 시리얼라이즈할 모델명을 적어준다.

fields에 원하는 컬럼명을 적어서 특정 컬럼만 시리얼라이즈, 노출시킬 수 있다.

(__all__은 모든 컬럼을 다 포함한다는것)


serializers.py를 모두 작성했다면 이제 views.py를 작성해야한다.

views.py를 열고 아래의 세줄을 import시킨다.


from rest_framework.response import Response
from rest_framework.views import APIView
from . import models, serializers

예전에 rest framework를 사용했을때는 viewsets를 사용했는데 이 강의에서는 APIView를 사용한다.

viewsets와 마찬가지로 APIView에서도 GET/POST/DELETE같은 메소드들이 존재한다.

그리고 우리는 해당 메소드를 오버라이드해서 프로젝트에 맞게 수정해야 한다.


class ListAllImage(APIView):
def get(self, request, format=None):
all_images = models.Image.objects.all()
serializer = serializers.ImageSerializer(all_image, many=True)
return Response(data=serializer.data)

get을 오버라이드했다. (fotmat=None으로 주면 기본적으로 json format)

먼저 모든 이미지를 불러오고, 불러온 이미지를 serializer를 통해 변환시켜줬다. (이미지가 하나가 아니므로 many=True)

마지막으로 serializer.data에 데이터가 들어있으므로 해당값을 return해준다.


views.py까지 성공적으로 작성했다면 이제 urls.py를 통해 라우팅만 시켜주면 된다.

강의에서는 장고버전이 1.11이기때문에 url을 통해 라우팅 시켜준다.

하지만 나는 2.0버전을 사용하고 있으므로 path를 사용할 것이다.

path를 사용하면 불편하게 regex를 사용하지 않아도 된다.

먼저 프로젝트의 urls.py를 다음과 같이 수정한다.


from django.contrib import admin
from django.urls import path, include
from images.views import ListAllImage

urlpatterns = [
path('admin/', admin.site.urls),
path('images/', include('images.urls')),
]

images/로 들어오는 입력에 대해 include를 통해 images앱의 urls를 포함시켜줬다.

그리고 images/urls.py를 다음과 같이 수정한다.


from django.urls import path
from . import views

urlpatterns = [
path('', views.ListAllImage.as_view(), name='all_images'),
]

참고로 우리는 views.py를 클래스 기반으로 작성했기 때문에 as_view()를 통해 변환시켜 줘야 한다.

위처럼 수정한 후 /images 로 들어갔을때 아래와 같이 나오면 정상이다.

(이 부분에 관련해서 괜찮은 문서가 하나 있다 -> http://ruaa.me/django-view/ )



class LikeSerializer(serializers.ModelSerializer):
image = ImageSerializer()
class Meta:
model = models.Like
fields = '__all__'

이런식으로 image에 ImageSerializer를 담으면 이미지 필드 또한

Nested하게 표현이 가능하다.


추가적으로 이전에 Foreign Key를 설정하면 자동으로 _set필드가 생긴다고 했었다.

현재 Comment, Like모델의 image필드가 Image모델을 향하고 있으므로

Image모델에는 comment_set/like_set이라는 필드가 자동적으로 생긴다.

물론 __all__을 통해서는 표시되지 않는다.

직접 값을 보기 위해서는 필드를 표시하도록 fields내에 설정해줘야 한다.

설정해준 후 값을 다시확인해보면 아래와 같다.


comment_set이라고 이름을 붙여주고 serializers.py의 fields에 추가해줬다.

그러면 위처럼 댓글의 PK값이 표시된다.

만약 여기서 PK값이 아닌 Nested한 자세한 정보를 보고싶다면 이전에 했던 것처럼 다음과 같이 코드를 수정한다.


class ImageSerializer(serializers.ModelSerializer):
comment_set = CommentSerializer(many=True)
like_set = LikeSerializer(many=True)

class Meta:
model = models.Image
fields = (
'id',
'file',
'location',
'caption',
'comment_set',
'like_set',
)

그리고 /images 로 들어가보면,


위처럼 comment_set이라는 이름으로 Nested한 정보들이 출력됐다.

또 한가지, 여기서 comment_set이라는 이름을 원하는 걸로 바꾸고 싶을 때가 있다.

예를 들어 comments로 바꾼다고 가정한다.

models.py에서 정의할때 related_name을 주면 된다.


image = models.ForeignKey(Image, on_delete=models.CASCADE, null=True, related_name='comments')

그다음 serializers.py에서 comment_set대신 comments로 바꿔준다.


class ImageSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True)
likes = LikeSerializer(many=True)

class Meta:
model = models.Image
fields = (
'id',
'file',
'location',
'caption',
'comments',
'likes',
)

그리고 출력해보면 comments, likes로 출력되는걸 확인할 수 있다.

반응형

'Coding > Django' 카테고리의 다른 글

Django delete(), add(), remove(), @property 정리  (0) 2018.04.23
Django Getting User Feed 정리  (0) 2018.04.22
Django Admin 페이지 수정 정리  (0) 2018.04.20
Django Model 정리  (0) 2018.04.19
Django Custom User Model 만드는 방법  (0) 2018.04.18