Framework/Django

DRF 심화과정 4주차

JM Lee 2023. 4. 23. 13:42
728x90

요약 : 공식문서가 답이다!!!!!

 

CHECKLIST

  • restful한 api 설계를 할 수 있다.
  • 미디어 파일과 스태틱 파일에 대해 이해한다.
  • 게시글 모델과 조회/업로드를 위한 serializer를 만들 수 있다.
  • 이미지를 포함한 게시글 기능을 개발할 수 있다.
  • 포스트맨으로 백엔드 개발을 하면서 테스팅을 할 수 있다.
  • drf에서 댓글 기능을 개발할 수 있다.
  • drf에서 좋아요 기능을 개발할 수 있다.
  • drf에서 follow 기능을 개발할 수 있다.
  • many-to-many 관계를 설정하는 경우와 방법, 그리고 related_name의 사용방법을 이해한다.

1. RESTFUL한 API 설계

내용이 너무 많아서 일단 메인페이지를 예시로.

# Urls.py

from django.urls import path
from articles import views

urlpatterns = [
    path('', views.ArticleView.as_view(), name='Article_View'),
]

# 경로 설정 확실하게 해주기,
# 필요한 것 import 확실하게 해주기
# 형식 : path('경로/', 파이썬파일.함수.as_view(), name=''),
# views.py

class ArticleView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        selializer = ArticleListSerializer(articles, many=True)
        return Response(selializer.data, status=status.HTTP_200_OK)

    def post(self, request):
        if not request.user.is_authenticated:
            return Response("로그인이 필요합니다.", status=status.HTTP_401_UNAUTHORIZED) 
        serializer = ArticleCreateSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
            

# 클래스형 views.py
# 함수명은 데이터에 대한 그 함수의 성격에 따라 설정
# 유저가 유효하지 않을 경우(자동 로그아웃 시) 다시 로그인 요구
# 시리얼라이저가 유효하지 않으면(if serializer.is_valid()이 아닐 시) 저장 불가능
# status=status.HTTP__
# models.py

from django.db import models
from users.models import User
from django.urls import reverse
# Create your models here.

class Article(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # 1대 다수
    title = models.CharField(max_length=50)
    content = models.TextField()
    image = models.ImageField(blank=True, upload_to='%Y/%m')
    # upload_to에 따라 media 폴더 안에 날짜에 맞는 폴더가 따로 생긴다.
    # m은 month, M은 minute이니 주의할 것
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.title)
    
    def get_absolute_url(self):
        return reverse('detail_view', kwargs={'article_id': self.id})
        

# model 저장할 때 table 명시
# models.py 업데이트 하면 반드시 migrate 작업
# def __str__(self)는 화면에 드러내는 테이블(하이퍼링크?)을 설정해주는 것(여기서는 제목을 드러냄)
# get_absolute_url(self)는 아직 완전히 이해하진 못함.. kwargs 설명해주실 분 도와주세요ㅠ

 

2. 미디어 파일과 스태틱 파일에 대해 이해한다.

imagefield를 쓸 때는 이미지를 사용하는 설치파일(pip install pillow) 다운로드 필수

pip를 하면 반드시 pip freeze > requirements.txt 필수

# 공식문서 참조

How to manage static files (e.g. images, JavaScript, CSS) | Django documentation | Django (djangoproject.com)

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

settings.py와 프로젝트/urls.py를 손 많이 대야 함.

 

MEDIA 파일은 개발 단계에서 사용

STATIC 파일은 배포 단계에서 사용

생성 날짜에 따라 또 MEDIA 내부에서 폴더를 생성하는데 이 원리는 아직 잘 모르겠음.. 폴더 찾는 중

 

3. 게시글 모델과 조회/업로드를 위한 serializer를 만들 수 있다.

# views.py

class ArticleView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        selializer = ArticleListSerializer(articles, many=True)
        return Response(selializer.data, status=status.HTTP_200_OK)

 

# serializers.py

class ArticleListSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    likes_count = serializers.SerializerMethodField()
    comments_count= serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.email
    
    def get_likes_count(self, obj):
        return obj.likes.count()
    
    def get_comments_count(self, obj):
        return obj.comments.count()

    class Meta:
        model = Article
        fields = ['pk', 'title','image', 'updated_at',"user",'likes_count','comments_count']
        
# 화면에 보이는 것들을 시리얼라이징을 통해 내보임.
# 모델에 저장한 것들을 class meta를 통해 가져오는 건가?

 

5. many-to-many 관계를 설정하는 경우와 방법, 그리고 related_name의 사용방법을 이해한다.

many to many는 한 사람이 여러 팔로워를 보는 경우, 마찬가지로 다른 사람도 여러 팔로워를 보는 경우에 해당

>> 모두가 one to many가 가능할 때를 many to many로 본다.

 

변수명 = models.ManyToManyField("self", symmetrical=False, related_name="필드에 연관있는 모델명", blank=True)

 


나머지는 너무 장황하고 그냥 실습하는 체크리스트라 패스!

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

Poetry 설치 및 기초 세팅  (0) 2023.06.07
데이터 관계 모델 정리  (2) 2023.05.18
DRF 심화과정 3주차  (0) 2023.04.23
장고 심화 1주차  (8) 2023.04.18
VS code 오류[갑자기 가상환경이 작동하지 않는다!]  (0) 2023.04.11