본문 바로가기

회고록(TIL&WIL)

TIL 2022.06.25 DRF/ 아침 숙제 풀이

class ItemView(APIView):
    #카테고리에 따라 다음과 같이 Response data를 반환하도록 GET 메소드 구현
    # /item?category=appliance
    def get(self, request):
        category = request.GET.get('category', None)

        # items = Item.objects.filter(category__name = category)
        # 역참조를 이용하는 prefetch_related 쓰면 성능이 향상 됨
        items = Category.objects.prefetch_related('item_set').get(name=category).item_set.all()

        if items.exists():
            serializer = ItemSerializer(items, many=True)
            return Response(serializer.data)

        return Response(status=status.HTTP_404_NOT_FOUND)


    # item serializer를 이용하여 item을 등록하는 POST 메소드 구현
    def post(self, request):
        item_serializer = ItemSerializer(data=request.data)

        if item_serializer.is_valid():
            # Category.objects.filter(id=request.data['category'])
            category_instance = get_object_or_404(Category, id=request.data['category'])

            item_serializer.save(category=category_instance)
            return Response(status=status.HTTP_200_OK)

        return Response(item_serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ItemOrderView(APIView):

    def get(self, request):
        # /item/order?order_id=1
        order_id = self.request.query_params.get('order_id')

        # 주문id가 일치하고 Order모델의 order_date 범위가 현재시간 기준으로 일주일전까지의 주문내역만 조회하도록 구현 (Q객체 사용)
        data = ItemOrder.objects.filter(
            Q(order__order_date__range=[timezone.now() - timedelta(days=7), timezone.now()]) &
            Q(order_id=order_id)
        )

        if data.exists():
            serializer = ItemOrderSerializer(data, many=True)
            return Response(serializer.data)

        return Response(status=status.HTTP_404_NOT_FOUND)

 

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import permissions, status

from .models import (
    JobPostSkillSet,
    JobType,
    JobPost,
    Company
)
from .serializers import JobPostSerializer
from django.db.models.query_utils import Q


class SkillView(APIView):
    permission_classes = [permissions.AllowAny]

    def get(self, request):
        # 고정적으로 두개의 기술을 입력받아 검색하는 로직을 구현한 후, 
        # 입력 기술 스택을 가변적으로 처리하는 로직을 구현
        
        # /post?skills=django&skills=mysql
        # request.GET.getlist('skills', '') >>> skills = django, mysql
        # 헤더에 같은 파라미터 값이 여러개일 경우 가져올 때 getlist사용
        skills = request.query_params.getlist('skills', '')
        print("skills = ", end=""), print(skills) # ["mysql","python"]

        # job_skills = JobPostSkillSet.objects.filter(
        #     Q(skill_set__name='python') | Q(skill_set__name='mysql')
        # )

        # Q(skill_set__name='python') | Q(skill_set__name='mysql') | Q(skill_set__name='OOO') | ...
        # 입력한 skill 들이 전부 or 형태로 검색되어야 하기 때문에
        # Q 의 인스턴스를 생성해서 각각의 스킬들을 add 한 것
        query = Q()  
        for skill in skills:
            query.add(Q(skill_set__name=skill), Q.OR)

        # 검색에 해당하는 스킬들(django, mysql) 쿼리셋을 가져옴
        job_skills = JobPostSkillSet.objects.filter(query)

        # 역참조를 이용해 해당 스킬을 가지고 있는 job_posts 쿼리셋을 가져옴
        job_posts = JobPost.objects.filter(
            id__in=[job_skill.job_post.id for job_skill in job_skills]
        )

        # 결과 쿼리셋이 있다면 시리얼라이저를 이용해서 해당 쿼리셋 결과 Response
        if job_posts.exists():
            serializer = JobPostSerializer(job_posts, many=True)
            return Response(serializer.data)

        return Response(status=status.HTTP_404_NOT_FOUND)


class JobView(APIView):
    def post(self, request):
        # job_type은 테이블에 존재하지 않는 데이터이면 400에러 리턴할 것
        # 회사 이름이 존재 하지 않으면 생성해서 채용공고를 등록할 것

        # "JobType" : "1"
        job_type = int(request.data.get("job_type", None)) 

        # "JobType" : "permanent"
        # job_type = request.data.get("job_type", None) 

        company_name = request.data.get("company_name", None)

        # 직업 유형 처리
        # "JobType" : "1"
        job_type_qs = JobType.objects.filter(id=job_type)

        # "JobType" : "permanent"
        # job_type_qs = JobType.objects.filter(job_type=job_type) 

        if not job_type_qs.exists():
            return Response({"message": "invalid job type"}, status=status.HTTP_400_BAD_REQUEST)

        # 회사 이름 처리
        company = Company.objects.filter(company_name=company_name)

        # 입력한 회사명이 존재x -> 새로 등록 / 존재o object 받아옴
        if not company.exists():
            company = Company(company_name=company_name).save()
        else:
            company = company.first()

        # request.data.pop('job_type', None)
        # 채용공고 시리얼라이저를 이용해서 데이터 검증 및 저장
        job_serializer = JobPostSerializer(data=request.data)
        if job_serializer.is_valid():
            # 회사이름과, 고용형태는 ForeignKey 여서 그에 맞는 object들 저장
            job_serializer.save(company=company, job_type=job_type_qs.first())
            return Response(status=status.HTTP_200_OK)

        return Response(job_serializer.errors, status=status.HTTP_400_BAD_REQUEST)