원래 시리얼라이저에 넣고 .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 는 그 객체와 create됐는지 아닌지 정보 둘다 반환한다. 맨 앞에 변수 하나만 쓰면 그 안에 두 정보 둘다 들어가니까 분리해서 두개 써줘야 한다.
hashtag , _ = Hashtag.objects.get_or_create(hashtag=tag)
필터링하고 싶은 정보를 담아서 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