상세 컨텐츠

본문 제목

221027 DRF 4일차

카테고리 없음

by hunss 2022. 10. 27. 09:56

본문

DRF로 CRUD하는 실습을 했음.

순서를 정리를 하면

 

urls.py는 그동안 하던거와 크게 다를게 없음

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

프로젝트 urls.py에 이 둘을 추가하면 static이미지파일(내가 넣어놓는거 ex default.png)은 static_url로 사용자가 입력하는? 그런 이미지들은 media_url로 통해 media로 들어가게 함.


settings.py

STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / "static"

MEDIA_ROOT = BASE_DIR / "media"
MEDIA_URL = "/media/" 
 
이렇게 추가해주는 거 까지.
그리고 SIMPLE_JWT로 simplejwt 쓸 때 access_token 유효시간이라던가 refresh_token유효시간 같은거 조절가능

경로설정했으면 views.py가서 class형으로 함수쓰기
기능마다 api 정해서 / get post put delete 등
그냥
 
class ArticleView(APIView):
    def get(self, request):
        pass
 
이런식으로 대충 적어놓고

이제 필요한게 serializers.py
 
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"
 

이게 제일 간단한 버전인데, 여기서 fields를

fields = ("email", "id", "followings", "followers", "article_set", "like_articles")
이런식으로 필요한 필드만 할 수 있음.
 
serializers.py 쓸 때 models.py의 관계를 잘 생각해야한다.
자기 테이블에 없는거 가지고 오려면 
followers = serializers.StringRelatedField(many=True)

이런식으로 StringRelatedField로 지정해서 가져와야함.

예시로 Class Comment 코멘트 클래스를 만들 때 comment_count를 직접 필드로 만들지 않고

serializers.py 에서 

comment_count = serializers.SerializerMethodField() 
이렇게 불러오기 가능.
 
serializer 의 다양한 기능이 있으니까 공홈 영어 잘 읽어봐야함...
 

views.py Class에서 필요한 serializer를 작성했다면, 다시 views.py에 와서 Class api함수를 serializer를 활용해서 적어야함.

제일 간단한 게시글 ArticleView에서 게시글 가져오는건

class ArticleView(APIView):
    def get(self, request):
        articles= Article.objects.all()
        serializer = ArticleListSerializer(articles, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
articles를 Article모델에서 오브젝트로 다 가져오고 serializer를 통해 json데이터로 바꾸고
return Response 로 json화 된 serializer.data를 보내줌 + 잘 작동됐다? 상태 200 OK도 같이 보내기

 

permissions_classes = [permissions.IsAuthenticated]
이거는 로그인한 사용자만 사용할 수 있게 해주는데 
if request.user == ~~ 뭐 이런식으로 해도 되는데, 훨씬 간편하게 가능하도록 만들어줌.
 

그리고 q object가 있음.

q object는 and 하고 or같은 조건부 검색? 을 할 수 있음

class FeedView(APIView):
    permissions_classes = [permissions.IsAuthenticated]
   
    def get(self, request):
        q = Q()
        for user in request.user.followings.all():
            q.add(Q(user=user),q.OR)
        feeds = Article.objects.filter(q)
        serializers = ArticleListSerializer(feeds, many=True)
        return Response(serializers.data)

 

FeedView이 불러지면 q = Q() 로 q 선언하고

q.add 로 조건을 추가

q.add(Q(field명=찾는값), q.OR) 얘를 for user in request.user.followings.all()을 통해 for 문 돌면서 

user=user인 user를 하나하나 찾음. 그러고

feeds 는 Article 모델에서 user인 오브젝트를 가져오고

걔를 serializer를 통해 json 화시킴.

 


이런식으로 게시글 / 게시글 디테일 / 좋아요 / 댓글 /  피드 까지 했음