2023. 4. 19. 22:50ㆍTIL/2023.4월
2023.04.19 수
오늘 본격적으로 DRF 프레임 워크를 사용하였습니다! serializers을 처음 사용 본 느낀점은 '익숙해지면 편하다!' 입니다.
노인분들이 스마트폰 사용방법을 배우는 느낌으로 강의를 진행했지만,
역시 처음 사용해보는 방법이라 그런지 구조를 생각하고 어떻게 구현하였는지, 어떤 모듈을 사용했는지 생각하며 따라가려고 하니 진도가 늦습니다.
오늘 TIL은 새롭게 배운 것을 바탕으로 작성해보겠습니다.
1. 이 코드는 왜 사용하는지
def __str__(self):
예시코드나 팀 프로젝트에서 종종 보였던 코드였습니다, 그동안 사용하는 이유를 몰랐습니다.
클래스 내 객체를 어떻게 출력할지 결정하는 기능을 합니다.
class Articles(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
이런 형태의 클래스가 있을 때, 따로 지정해 주지 않는다면
객체는 Articles object() 형태로 출력됩니다.
def __str__(self):
return str(self.title)
이때 이렇게 출력방식을 정해준다면,
이런 형태로 출력됩니다.
2.오늘 배운 DRF 모듈
articles/views.py/
from rest_framework.decorators import api_view
from articles.serializers import ArticlesSerializers
from rest_framework.response import Response
from rest_framework import status
from rest_framework.generics import get_object_or_404
from rest_framework.decorators import api_view
:DRF 프레임워크를 사용하는데 필요합니다. DRF 프레임워크는 따로 프론트엔드 영역의 문서를 작성하지 않아도 기능을 사용하거나, 테스트 할 수있는 공간을 제공합니다.
데코레이터로 사용할 메서드를 설정하고 이를 서버에서 테스트 할 수 있습니다.
@api_view(['GET','POST'])
def articleAPI(request):
if request.method == 'GET':
articles = Articles.objects.all()
serializer = ArticlesSerializers(articles, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticlesSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
from rest_framework.response import Response
DRF를 사용하기 위한 기본적인 모듈입니다. (설명보단 해당 페이지를 보는게 좋습니다.)
https://www.django-rest-framework.org/tutorial/2-requests-and-responses/
2 - Requests and responses - Django REST framework
From this point we're going to really start covering the core of REST framework. Let's introduce a couple of essential building blocks. REST framework introduces a Request object that extends the regular HttpRequest, and provides more flexible request pars
www.django-rest-framework.org
from rest_framework import status
from rest_framework.generics import get_object_or_404
응답 시 상태를 출력하기 위해 사용합니다, 오류 및 비정상적인 응답이 이루어졌는지 나타냅니다.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
HTTP response status codes - HTTP | MDN
HTTP response status codes indicate whether a specific HTTP request has been successfully completed. Responses are grouped in five classes:
developer.mozilla.org
from articles.serializers import ArticlesSerializers
articles app에 만든 serializers.py를 사용하기 위해 사용했습니다.
3.serializer는 무엇인지
articles/serizlizers.py/
from rest_framework import serializers
from articles.models import Articles
class ArticlesSerializers(serializers.ModelSerializer):
class Meta:
model = Articles
fields = "__all__"
위는 serializers.py에 작성한 코드입니다, 먼저 사용을 위해
from rest_framework import serializers
import 시켜줍니다.
serializer를 사용하는 이유는 좋기 때문이겠죠?
DB에 저장된 객체를 serializer을 사용하지 않고 출력하기 위해서 어떻게 해야할까요?
@api_view(['GET'])
def index(request):
articles = Articles.objects.all()
article = articles[0]
article_data = {
"title":article.title,
"content":article.content,
"created_at":article.created_at,
"updated_at":article.updated_at,
}
return Response(article_data)
일단 articles라는 변수에 DB에 저장된 값을 가져옵니다, 여러 개의 정보가 저장되어있다면, 몇 번째 것인지 지정해야겠죠?
가장 첫번째 것을 선택한 후 그 객체의 어떤 값을 가져올지 정해야 합니다.
딕셔너리 형태라면 키와 값으로 표현하여 지정해준 후 값을 출력합니다, 만약 출력해야할 필드가 많다면 당연히 키도 많아질 것입니다.
article_data = {
"title":article.title,
"content":article.content,
"created_at":article.created_at,
"updated_at":article.updated_at,
}
이미 modle 영역에서 다 지정되어 있는 것을 따로 또 지정하기에는 너무 비효율적입니다, 이를 더 편하게 관리하기 위해 serializer을 사용하는 것입니다.
class Articles(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
def __str__(self):
return str(self.title)
이 모델을 사용한다고 할 때
class ArticlesSerializers(serializers.ModelSerializer):
class Meta:
model = Articles
fields = "__all__"
이런 형태로 serializer를 구현할 수 있습니다.
이름을 정하고, 이미 정의된 것을 상속받아 사용하기 위해 표현해줍니다.
class Meta를 이용하여 어떤 모델을 사용할 것이며, 해당 모델의 어떤 필드를 사용할 것인지 지정해주면, 더 이상 view 영역에서 모델을 사용할 때 이미 지정된 것들을 또 다시 지정할 필요가 없어집니다!
그 외에도 serializer는 다양한 장점이 있다고 하니 이는 강의를 진행하면서 알아보겠습니다.
느낀점
새로운 것을 배우는 시간은 언제나 기대와 걱정이 따라옵니다, 그래도 다행인 것은 django를 처음 배울 때 느꼈던 막막함은 없다는 점입니다.
오늘 진도를 못 뺐지만 빠른 학습보다는 좀 더 정확한 개념잡기와 사용방법 익히기를 목표로 두고 강의를 따라가야겠습니다!
'TIL > 2023.4월' 카테고리의 다른 글
TIL CORS (0) | 2023.04.21 |
---|---|
TIL CBV(클래스형 뷰), swagger (0) | 2023.04.20 |
TIL 장고 심화과정 mypy, Black, Django Ninja (0) | 2023.04.18 |
TIL 또 알고리즘 직사각형 넓이 구하기 (0) | 2023.04.13 |
TIL count (0) | 2023.04.12 |