[Django] get_or_create

채린·2023년 9월 1일

원래 시리얼라이저에 넣고 .save()를 해주는데, 여기서는 get_or_create가 필요해서 시리얼라이저에 안넣었다..
mtv처럼 create와 시리얼라이저.save 둘다 가능한데 뭘로해도 아예 상관없는건진 모르겠다

request

line/int:post_pk/

{
	"line_postsec": 4,           # 게시물 섹션 id
	"sentence": 1,               # 문장 인덱스(섹션 내 몇번째 문장인지) 
	"content":"[밑줄 문장 내용]"    # 자료형 text
}

이 post의 postsec의 sentence에 해당하는 Line이 있으면 가져와서 user를 추가하고, 없으면 만들어야한다

views.py

class MyLineView(views.APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request, post_pk):
        now_user=request.user
        post= get_object_or_404(Post, post_id=post_pk)                                 # 현재 포스트 객체
        post_sec=get_object_or_404(PostSec, sec_id=request.data['line_postsec'])       # 현재 포스트 섹션
        sentence=request.data['sentence']   
        line, created = Line.objects.get_or_create(line_post=post,line_postsec=post_sec,sentence=sentence)            # 현재 포스트의 섹션의 순번에 해당하는 line이 있으면 가져오고 없으면 만든다. 만들어졌다면 created=true
        line.line_user.add(now_user)                                                   # 현재 사용자 추가
        return Response({'message': '밑줄 긋기 성공', 'data': {'line_id': line.line_id, 'sentence': line.sentence}}, status=status.HTTP_200_OK)

line_post, line_postsec sentence으로 Line을 get_or_create한다음 line객체에 바로 now_user를 add했다

get_or_create 주의할 점

  1. get_or_create 는 그 객체와 create됐는지 아닌지 정보 둘다 반환한다. 맨 앞에 변수 하나만 쓰면 그 안에 두 정보 둘다 들어가니까 분리해서 두개 써줘야 한다.
    hashtag , _ = Hashtag.objects.get_or_create(hashtag=tag)

  2. 필터링하고 싶은 정보를 담아서 get_or_create해주면 새로 생긴 객체에는 다른 필드 정보가 없다. 잊지않고 추가해주자.

vote_per, created= VotePer.objects.get_or_create(voteper_user=user, voteper_vote=vote) 
if created: 				# 새로 create됐을 때만 정보 추가
	vote_per.age=user.age

0개의 댓글