현제의 현재이야기

[KLAE] 1228 개발일지 본문

DRF/KLAE

[KLAE] 1228 개발일지

현재의 현제 2022. 12. 28. 08:54

AWS RDS를 통해서 데이터베이스 인스턴스 생성 완료

로컬 데이터베이스에도 연결완료, 구글의 삽질이 수월함에 도움을 주었다.

https://hoons-up.tistory.com/44

 

[Develop/Database] AWS RDS MySQL 프리티어 생성

AWS RDS MySQL 프리티어 생성 최근에 AWS로 EC2 서버를 생성했는데 DB 서버도 구축해보고 싶어 AWS에서 프리티어로 제공하는 MYSQL RDS를 설치하면서 그 과정을 포스팅한다. 설치방법은 AWS 계정이 존재한

hoons-up.tistory.com

많이 도움을 준 블로그 감사합니다!

| 좋아요 수정

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=[''])를 이용해서 데이터베이스에 기록해줌
 

🏃🏼 Django 메소드 정리

장고의 메소드에 대해 정리해보자일치하는 조건을 입력할 때 사용언더바 두개 (\_\_)\-조건을 사용할 경우 \-외부 모델 필드를 사용할 경우 부분 일치 조건 입력할 때 사용여러 조건을 포함할 경

velog.io

  • 이 블로그에서 count() 함수를 알아냄. 처음에 len 함수로 했는데 안됐다
 

update_fields - 어떤 필드를 저장할지 지정하기 · 초보몽키의 개발공부로그

update_fields - 어떤 필드를 저장할지 지정하기 31 Dec 2017 | django model update_fields 만약 save() 메소드 호출시에 update_fields 라는 키워드 인자로 필드 이름 리스트가 함께 전달 된다면, 해당 필드 목록만

wayhome25.github.io

| 공유하기

#공유하기 버튼 눌렀을 때
@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