현제의 현재이야기
[KLAE] 1228 개발일지 본문
AWS RDS를 통해서 데이터베이스 인스턴스 생성 완료
로컬 데이터베이스에도 연결완료, 구글의 삽질이 수월함에 도움을 주었다.
https://hoons-up.tistory.com/44
많이 도움을 준 블로그 감사합니다!
| 좋아요 수정
models.py 수정
class Post(models.Model):
title = models.CharField(max_length=100)
writer = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
image = models.URLField(max_length=200, null = True, blank = True )
body = models.TextField(default="default")
growing_record = models.TextField(null = True, blank = True )
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
grow_date_info = models.DateField(null=True)
like_users = models.ManyToManyField(User, related_name='likepost', null=True)
share = models.BooleanField(default=False)
like_num = models.IntegerField(null=True, default=0)
- share라는 필드를 추가해서 유저가 공유를 했는지 안했는지 여부를 알 수 있게함
- like_num을 post 테이블에 추가해서 like_users 배열의 개수를 담을 수 있게함
# 좋아요
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def likes(request, pk):
try:
post = Post.objects.get(pk=pk)
if post.like_users.filter(pk=request.user.id).exists():
post.like_users.remove(request.user)
post.like_num = post.like_users.count()
post.save(update_fields=['like_num'])
serializer = LikeUsersSerializer(post)
return Response(serializer.data)
else:
post.like_users.add(request.user)
post.like_num = post.like_users.count()
post.save(update_fields=['like_num'])
serializer = LikeUsersSerializer(post)
return Response(serializer.data)
except Post.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
- like_users 필드는 [] 같이 배열 형태로 넘어옴. 이것을 .count()함수로 만든뒤 save(undate_fields=[''])를 이용해서 데이터베이스에 기록해줌
- 이 블로그에서 count() 함수를 알아냄. 처음에 len 함수로 했는데 안됐다
| 공유하기
#공유하기 버튼 눌렀을 때
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def share(request, pk):
try:
post = Post.objects.get(pk=pk)
if post.share == False:
post.share = True
post.save(update_fields=['share'])
serializer = GetSerializer(post)
return Response(serializer.data)
else:
post.share = False
post.save(update_fields=['share'])
serializer = GetSerializer(post)
return Response(serializer.data)
except Post.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
- 처음에 post.save를 안해서 함수를 불러올 당시는 값이 변하였으나, 데이터베이스에는 변화가 없었음. 이것을 수정
- 공유한 게시글에 사용자가 다시 공유를 취소할 수 있게 만들어줌
| 페이지네이션(공유게시판 16개 게시글)
#공유게시판 16개
@api_view(['GET'])
@authentication_classes([SessionAuthentication,BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_page_posts(request, pk):
posts = Post.objects.filter(share=True)
paginator = Paginator(posts, 5)
page_obj = paginator.get_page(pk)
serializer = PageSerializer(page_obj, many=True)
return Response(serializer.data)
- drf pagination을 찾아봤는데 아쉽게도 fbv 기반의 페이지네이션에 관련된 내용이 없어서 그냥 구현해보았다. 여기서 share가 True인 것만, 즉 사용자가 공유한 것만 나타나도록 설정
- 프론트와 통신을하고 어떤 문제가 발생하는지 알아야함. serializer에 담겨야 할 내용을 정확히 모르겠음
| 일지공유게시판(최신순 4개 , 좋아요순 4개)
#일지공유게시판 최신 4개
@api_view(['GET'])
@authentication_classes([SessionAuthentication,BasicAuthentication])
@permission_classes([IsAuthenticated])
def new_4_posts(request):
posts = Post.objects.filter(share=True).order_by('-created_at')
paginator = Paginator(posts, 4)
page_obj = paginator.get_page(1)
serializer = PageSerializer(page_obj, many=True)
return Response(serializer.data)
#일지공유게시판 공감 4개
@api_view(['GET'])
@authentication_classes([SessionAuthentication,BasicAuthentication])
@permission_classes([IsAuthenticated])
def likes_4_posts(request):
posts = Post.objects.filter(share=True).order_by('-like_num')
paginator = Paginator(posts, 4)
page_obj = paginator.get_page(1)
serializer = PageSerializer(page_obj, many=True)
return Response(serializer.data)
- 필터를 통해서 공유된 게시글들 중에서 .order_by를 통해서 최신순4개, 좋아요 수 4개를 불러오는 함수를 만듦
- 페이지네이션을 통해서 4개의 게시글만 보이게 설정
| 메인페이지 유저가 작성한 글 모음
#메인페이지 작성된 일지 유저벌로
@api_view(['GET'])
@authentication_classes([SessionAuthentication,BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_user_post(request, pk):
posts = Post.objects.filter(writer=pk).order_by('-created_at')
serializer = GetSerializer(posts, many=True)
return Response(serializer.data)
- 이것도 마찬가지로 filter와 order_by를 이용함
- filter의 값은 post 테이블에 있는 writer값이 pk값, 즉 user_id일 시, 해당 유저가 작성한 글을 모음
- 페이지네이션이 필요 없다고함.
'DRF > KLAE' 카테고리의 다른 글
[KLAE] 1230 개발일지 (0) | 2022.12.30 |
---|---|
[KLAE] 1229 개발일지 (0) | 2022.12.29 |
[KLEA] 1128 개발일지 (좋아요 기능) (0) | 2022.11.28 |
[KLEA] 1125 개발일지 (django와 Mysql 연결, GCP) (0) | 2022.11.26 |
KLAE를 위한 복습 (0) | 2022.10.05 |
Comments