현제의 현재이야기

[KLAE] 0105 개발일지 본문

DRF/KLAE

[KLAE] 0105 개발일지

현재의 현제 2023. 1. 5. 23:37

구성파악의 치명적 오류 발견.

알고보니 Userplant(유저가 등록한 식물) 별로 일지가 나누어지는 형식이었다. 게다가

아까 작성된 일지를 기반으로 글 작성시 식물 이름이 그대로 넘어와야 한다. + n일차도 만들어야한다.

plants/views.py

#마이페이지 사이드바 - 유저에 맞는(생성한) 식물 리스트
@api_view(['GET'])
@authentication_classes([SessionAuthentication,BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_user_plants(request):
    plants = UserPlant.objects.filter(user=request.user.id).order_by('-created_at')
    serializer = UserPlantsSidebar(plants, many=True)
    return Response(serializer.data)
  • 사이드바 구현. 유저가 생성한 식물들을 모아준다.

plants/serializers.py

#사이드바
class UserPlantsSidebar(serializers.ModelSerializer):
    class Meta:
        model = UserPlant
        fields = ['id', 'name']
        read_only_fields = ['id']
  • 유저가 생성한 식문, userplant의 Id값과 이름을 넘겨준다.

accounts/models.py

class Post(models.Model):
    user_plant = models.IntegerField(null=True)
    ndate = models.IntegerField(default=0, null=True, blank=True)
  • 모델에 user_plant를 추가하여 post에 userplant가 저장되게 함
  • 또한 n일차를 반환하기 위해 ndate 필드를 생성

accounts/views.py

#식물별 작성된 일지 모아주기
@api_view(['GET'])
@authentication_classes([SessionAuthentication,BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_userplant_post(request, user_plant_id):
    posts = Post.objects.filter(user_plant=user_plant_id).order_by('-created_at')
    userplant = UserPlant.objects.get(pk=user_plant_id)
    date = userplant.created_at.replace(tzinfo=None)
    now = datetime.now().replace(tzinfo=None)
    posts.ndate = (now - date).days + 1
    serializer = PageSerializer(posts, many=True)
    return Response(serializer.data)
  • 사이드바가 먼저 불려오면, 거기에 맞는 user_plant_id를 넣어줘서 그에 맞는 목록(한 식물의 일지들)을 불러온다.
  • 그래서 userplant를 불러오고 그 userplant의 생성된 날짜와 현재 시간을 계산하여 post.ndate에 담는다.
#게시물 업로드
@api_view(['POST'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def post_one_post(request, user_plant_id):
    serializer = PostWritePutSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(writer = request.user, user_plant=user_plant_id) #1 = request.data
        return Response(status = status.HTTP_201_CREATED)
    return Response(status = status.HTTP_400_BAD_REQUEST)
  • 포스트 할 때, url을 통해서 user_plant_id를 통해서 해당 게시글의 user_plant의 값을 저장하거나, request의 한 변수를 통해서 담긴 자료를 통해서 넣을 수 있다. 이건 향후 프론트와 상의 필요
#한 게시물 조회
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_one_post(request, pk):
    try:
        post = Post.objects.get(pk=pk)
        comments = Comment.objects.filter(post__id = pk)
        userplant = UserPlant.objects.get(pk=post.user_plant)
        post.comment_cnt = comments.count()
        
        date = userplant.created_at.replace(tzinfo=None)
        now = datetime.now().replace(tzinfo=None)
        post.ndate = (now - date).days + 1

        post.save(update_fields=['comment_cnt', 'ndate'])
        serializer = GetSerializer(post)
        return Response(serializer.data)
    except Post.DoesNotExist:
        return Response(status = status.HTTP_404_NOT_FOUND)
  • get할 때 post에 담긴 user_plant를 통해서 해당 userplant를 불러어고, 여기서 date를 계산한다. 또한, 값도 저장

  • 글도 잘 담기고, ndate도 정상적으로 해결된다.
  • 어디에 ndate를 담아야 하는지 고민이 많았는데 매번 검색을 해야한다는 단점이 있지만(향후 개선) 그래도 해결돼서 기분이 좋다.
  • 프론트와 어떻게 통신해야될지 고민을 많이했는데, 역시 소통이 중요하다.

| 트러블 슈팅

 

[Python] can't subtract offset-naive and offset-aware datetimes

두 개의 datetime 사이에 차이를 이용하는 부분에서 아래와 같은 에러가 발생했다.can't subtract offset-naive and offset-aware datetimes에러가 난 코드이다.time1은 db에 저장된 값이고, time2는 aws 서버에서 돌

velog.io

  • 나도 aws서버를 이용해서 데이터베이스를 사용하다보니깐 저런 오류가 났다. .replace(tzinfo=None)를 추가해서 해결완료

 

 

'DRF > KLAE' 카테고리의 다른 글

[KLAE] 0107 개발일지  (0) 2023.01.07
[KLAE] 0106 개발일지  (0) 2023.01.06
[KLAE] 0103 개발일지  (0) 2023.01.04
[KLAE] 0102 개발일지  (1) 2023.01.02
[KLAE] 1230 개발일지  (0) 2022.12.30
Comments