ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django]selector가 반환하는 객체를 바꾸고 싶다
    카테고리 없음 2023. 6. 7. 22:14

    원래 mypage/selector/places/selctors에서(유저가 리뷰를 작성한 장소 리스트를 반환하는 selector)에서는 

    class UserReviewedPlaceSelector:
        def __init__(self, user:User):
            self.user = uses
        
        def list(self):
            user_reviews = PlaceVisitorReview.objects.filter(visitor_name__email=self.user)
            return user_reviews

    return을 PlaceVisitorReview객체로 하고 이를

    view에서

    class UserReviewedPlaceGetApi(APIView):
        class Pagination(PageNumberPagination):
            page_size = 6
            page_size_query_param = 'page_size'
    
        class UserReviewedGetSerializer(serializers.ModelSerializer):
    
            place_id = serializers.IntegerField()
            place_name = serializers.CharField(source='place.place_name')
            category = serializers.CharField(source='place.category')
            contents = serializers.CharField()
            rep_pic = serializers.ImageField(source='place.rep_pic')
            address = serializers.CharField(source='place.address')
    
    
            class Meta:
                model = PlaceVisitorReview
                fields = ['place_id', 'place_name','category','contents','rep_pic','address']

    다음과 같이 사용하였다!


    그럴거면 selector에서 Place객체를 반환하는게 좋지 않겠다는 팀원분의 제안!
    PlaceVisitorReview는 

    Place를 foreign키로 참조하고 있었다!

     

    바뀐 코드는 아래와 같다

    class UserReviewedPlaceSelector:
        def __init__(self, user: User):
            self.user = user
    
        def list(self):
            user_reviews = PlaceVisitorReview.objects.filter(visitor_name__email=self.user)
            reviewed_places = Place.objects.filter(id__in=user_reviews.values('place'))
            return reviewed_places

    해당 코드는 `user_reviews`에서 추출된 `PlaceVisitorReview` 객체들의 `place` 필드 값을 사용하여 `Place` 모델을 필터링하는 부분입니다.

    설명을 자세히 드리자면:

    1. `user_reviews.values('place')`: `user_reviews` 쿼리셋에서 `place` 필드의 값을 추출합니다. 이 결과는 `place` 필드의 값들로 이루어진 QuerySet이 됩니다.

    2. `Place.objects.filter(id__in=user_reviews.values('place'))`: `Place` 모델에서 `id` 필드의 값이 `user_reviews.values('place')`에 포함된 값들과 일치하는 객체들을 필터링합니다. 즉, `Place` 모델의 `id` 값이 `user_reviews`에 있는 `PlaceVisitorReview` 객체들의 `place` 필드 값들 중 하나와 일치하는 경우에 해당하는 `Place` 객체들을 가져옵니다.

    결과적으로, `reviewed_places`는 `PlaceVisitorReview` 객체에 참조된 `Place` 객체들의 쿼리셋입니다. 이를 통해 해당 사용자가 작성한 리뷰에 대응하는 `Place` 객체들을 얻을 수 있습니다.

    짜잔!

     


    근데 이렇게 하면 받아오는 정보에서 리뷰의 content는 가져올 수 없다.

    Place객체에서 content가 없기 때문!

Designed by Tistory.