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)
'회고록(TIL&WIL)' 카테고리의 다른 글
WIL 2022.07.06 SMOPS 유화제작 팀프로젝트 - S.A & KPT (0) | 2022.07.06 |
---|---|
WIL 2022.07.01 CORS, rest_framework_simplejwt, E2E 회원가입/로그인 (0) | 2022.07.02 |
TIL 2022.06.24 DRF/ User관련 구현, Article관련 구현, 특강 숙제 (0) | 2022.06.24 |
TIL 2022.06.23 머신러닝 특강 (0) | 2022.06.23 |
TIL 2022.06.21 DRF/ Permissions, django admin 심화, ORM심화 (0) | 2022.06.21 |