TIL_231010_Django ManyToManyField 사용해보기

Sol Lee·2023년 10월 10일
0

팀 프로젝트: 오늘부터 올해말까지 목표설정하고 기록하는 웹서비스

본인의 목표를 생성하고

게시글을 생성할 때 태그처럼 목표별 게시글 작성

유저별 게시글 페이지를 볼 때

📌 2023년, 00님은
'#회사원되기' 를 위해 000일동안 노력중입니다!
'#재난에서살아남을수있는체력' 을 위해 000일동안 노력중입니다!

요런식으로 표시되도록 하고 싶음

태그 앱 생성

urls.py

urlpatterns = [
    path('', views.TagView.as_view()), # 새로 생성
    path('<int:pk>/', views.TagView.as_view()), # 있던 태그 끌고 올 때
]

models.py

class Tag(models.Model):
    tag_name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

태그 자체를 카테고리처럼 쓸 생각이라 필드가 많이 필요 없음.

유저 앱에 ManyToManyField 추가

user의 models.py

tag_ids = models.ManyToManyField('tag.Tag', related_name='user_tag')

마이그레이션 하면 아래와 같은 테이블이 생김

목표태그 생성/설정 시 유저정보에 저장

ManyToManyField에 정보를 저장할 때는 add 사용

view.py

class TagView(APIView):
    def post(self, request):
        """ 목표를 직접 생성 """
        serializer = TagSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        user = User.objects.get(pk=request.user.pk)
        user.tag_ids.add(serializer.data['id'])
        return Response({"message":"성공."}, status=status.HTTP_201_CREATED)

    def put(self, request, pk):
        """ 이미 있는 목표를 설정 """
        user = User.objects.get(pk=request.user.pk)
        print(user)
        if user.tag_ids == pk:
            return Response({"message":"이미 설정된 목표입니다."}, status=status.HTTP_400_BAD_REQUEST)
        else:
            try:
                tag = Tag.objects.get(pk=pk)
                user.tag_ids.add(tag)
            except ObjectDoesNotExist:
                return Response({"message":"존재하지 않는 태그입니다."}, status=status.HTTP_400_BAD_REQUEST)

            return Response({"message":"성공."}, status=status.HTTP_200_OK)

아직 게시글 담당쪽에서 유저별 게시글 조회가 마무리가 안되어서 오늘은 여기까지.

내일 이어서 유저별 게시글 조회할 때 유저의 게시글에 해당목표태그가 지정된 개수를 계산해서 정보값으로 보내주는 작업해야 함.

profile
직업: 개발자가 되고 싶은 오레오 집사

0개의 댓글