티스토리 뷰
AI웹 개발자 과정 공부 (팀스파르타)/프로젝트
24.05.08_TIL ( 팀 프로젝트 : 스파르타 뉴스 Django ) _ 2. 댓글 연결 & 게시글 조회
티아(tia) 2024. 5. 8. 10:26728x90
[ 두번째 프로젝트 ]
스파르타 뉴스를 만들어 보자.
++ 팀 스로젝트로 팀과의 협업이 중요하다.
++ 장고 공식 문서는 항상 확인하기
https://docs.djangoproject.com/en/4.2/
https://github.com/1489ehdghks/spartaNews
1. 게시글 목록과 댓글 목록을 같은 화면에 나오게 해보자
- Article에 Comment 추가하기
- Nested Relationships
- Serializer는 기존 필드를 override 하거나 추가적인 필드를 구성할 수 있으며
- 이때 모델 사이에 참조 관계가 있다면 해당 필드를 포함하거나 중첩할 수 있습니다.
- 결국 우리가 조작해줘야할 것은~~ Serializer!
- 현재 Article → Comments 접근이 필요 == 역참조
- 역참조시 사용할 수 있는 comment_set 이 있으나 우리는 comments 로 명명합시다.
- articles 의 serializers.py를 바꾸어준다. Comment가 속해야 하기 때문에 먼저 정의되어야 속할 수 있기에 순서를 먼저 바꾸어준다.
from rest_framework import serializers
from .models import Article, Comment
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"
read_only_fields = ("article",)
class ArticleSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True, read_only=True)
class Meta:
model = Article
fields = "__all__"
2. 댓글 수가 나올 수 있게 하자.
- articles 의 serializers.py를 바꾸어준다.
class ArticleSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True, read_only=True)
comments_count = serializers.IntegerField(source="comments.count", read_only=True)
class Meta:
model = Article
fields = "__all__"
3. 댓글에 보이는 articles : 2 를 없애보자.
- 모델필드나 serializer 필드는 변경하지 않고 딱 보여지는 부분만 변경
- articles 의 serializers.py를 바꾸어준다.
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"
read_only_fields = ("article",)
def to_representation(self, instance):
ret = super().to_representation(instance)
ret.pop("article")
return ret
공식문서에는 모든 해답이 있습니다! https://www.django-rest-framework.org/api-guide/fields/#custom-fields
4. 댓글을 목록에서가 아니라 상세에서만 보이게 해주자.
- articles 의 serializers.py를 바꾸어준다.
- ArticleSerializer를 두개로 쪼개서 사용해주면 된다.
from rest_framework import serializers
from .models import Article, Comment
...
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = "__all__"
class ArticleDetailSerializer(ArticleSerializer):
comments = CommentSerializer(many=True, read_only=True)
comments_count = serializers.IntegerField(source="comments.count", read_only=True)
- articles 의 views.py 에서 Detail 부분을 ArticleDetailSerializer 로 바꾸어준다.
from .serializers import ArticleSerializer, ArticleDetailSerializer, CommentSerializer
...
class ArticleDetailAPIView(APIView):
def get_object(self, pk):
return get_object_or_404(Article, pk=pk)
def get(self, request, pk):
article = self.get_object(pk)
serializer = ArticleDetailSerializer(article)
return Response(serializer.data)
def put(self, request, pk):
article = self.get_object(pk)
serializer = ArticleDetailSerializer(article, data=request.data, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def delete(self, request, pk):
article = self.get_object(pk)
article.delete()
data = {"pk": f"{pk} is deleted."}
return Response(data, status=status.HTTP_200_OK)
반응형
'AI웹 개발자 과정 공부 (팀스파르타) > 프로젝트' 카테고리의 다른 글
24.05.10_TIL ( 팀 프로젝트 : 스파르타 뉴스 Django ) _ 4. 리드미 작성 & 최종 발표 (0) | 2024.05.10 |
---|---|
24.05.09_TIL ( 팀 프로젝트 : 스파르타 뉴스 Django ) _ 3. 대댓글 구현 & 오류수정 (0) | 2024.05.09 |
24.05.07_TIL ( 팀 프로젝트 : 스파르타 뉴스 Django ) _ 1. git & 댓글 구현 (0) | 2024.05.07 |
24.05.03_TIL ( 팀 프로젝트 : 스파르타 뉴스 Django ) _ 0. 기획하기 (0) | 2024.05.03 |
24.04.05_TIL ( 팀 프로젝트 : 스파르타 게시판 ) _ 4. 최최종 (미니프로젝트 제출 및 평가) (0) | 2024.04.05 |