DRF-TitleListSerializer와 TitleListAPIView 만들어보기!

김의석 ·2024년 6월 7일

Django

목록 보기
30/39

(user 기준으로 user가 작성한 양육일지 제목 리스트 조회 UI)

DRF-단일 모델조회 API와 외래키 학습 후 현재 PM(UI 디자인 겸)이 열심히 figma에 업데이트 중인 UI 중 하나를 골라 그 UI에 필요한 REST API를 만들어 보겠습니다!

urls.py

urlpatterns = []

urlpattern_api_v1 = [
    path("", views.TitleListAPIView.as_view(), name="title_list"),
]
urlpatterns += [
    path("api_report/", include((urlpattern_api_v1, "api-v1"))),
]

urls.py는 실습과 동일한 패턴으로 작성했다.

이후 개발에서도 이 패턴으로 API 버젼을 관리할 것 같다!

models.py

class UserCheck(models.Model):
	title = models.CharField(max_length=30, null=True, default=None)

UserCheck 모델에 title을 저장하는 필드가 없다는 것을 확인했다!
처음에는 date 필드 활용을 고민했지만 title 필드를 추가했다.

dummy data

class Command(BaseCommand):
	def handle(self, *args, **options):
		for __ in tqdm(range(cnt), desc="하나님 앞에서 생성"):
        title = f"{date}" "양육일지"  # 짧은 텍스트

		post = UserCheck(
        title=title,
        )

UI에 표시할 title 더미 데이터를 생성 후 확인!

serializers.py

class TitleListSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserCheck
        fields = [
            "id",
            "title",
        ]

    @staticmethod
    def get_optimized_queryset(request) -> QuerySet[UserCheck]:
        return UserCheck.objects.filter(teacher=request.user).only("id", "title")

# 기존 실습코드
# @staticmethod
   # def get_optimized_queryset() -> QuerySet[Post]:
       # return Post.objects.all().only("id", "title", "author").select_related("author")

구현하고자하는 양육일지 리스트 조회 API는 로그인한 USER 기준으로 조회하는 것이 목적이고, Queryset 작성 시 필히 request.user에 대한 접근이 필요하다.

하지만 @staticmethod의 클래스의 인스턴스 상태나 클래스의 변수에 의존하지 않고 독립적인 메서드인 경우에 상용되는 특성에 따라 기존 실습코드에서는 변수전달이 되지 않는 것을 확인했다!

get_optimized_queryset 메서드가 request를 전달 받을 수 있도록 수정했고 TitleListAPIView에서 일부 수정이 필요했다!

views.py

class TitleListAPIView(ListAPIView):
    serializer_class = TitleListSerializer

    def get_queryset(self):
        return TitleListSerializer.get_optimized_queryset(self.request)  # self?

    def list(self, request: Request, *args, **kwargs):
        response: Response = super().list(request, *args, **kwargs)

        if isinstance(request.accepted_renderer, (JSONRenderer, BrowsableAPIRenderer)):
            response.data = ReturnDict(
                {
                    "test!": True,
                    "result": response.data,
                },
                serializer=response.data.serializer,
            )
        return response


post_list_view = TitleListAPIView.as_view()

get_queryset를 오버라이드하여 request를 인자로 받는 인스턴스 메서드로 재정의!
마지막으로 TitleListSerializer.get_optimized_queryset 메서드에 requst를 전달할 수 있도록 했다!

result

User(uiseoo)를 기준으로 작성한 양육일지 리스트 조회 확인!

profile
널리 이롭게

0개의 댓글