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 화시킴.
이런식으로 게시글 / 게시글 디테일 / 좋아요 / 댓글 / 피드 까지 했음