-
[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가 없기 때문!