DRF 1:N 참조 테이블 객체 매핑 POST
380
작성한 질문수 2
class Company(models.Model):
company_name = models.CharField(max_length=30)
nationality = models.CharField(max_length=20)
region = models.CharField(max_length=40)
class Recruitment(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
position = models.CharField(max_length=20)
reward = models.IntegerField()
info = models.TextField()
skill = models.CharField(max_length=30)
Company 모델과 이를 참조하는 Recruitment 모델입니다
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = '__all__'
class RecruitmentSerializer(serializers.ModelSerializer):
company = CompanySerializer()
class Meta:
model = Recruitment
fields = '__all__'
depth = 1
각 모델의 serializer입니다,
class RecruitmentListView(APIView):
def post(self, request):
company_obj = Company.objects.get(pk=request.data.get('company')['id'])
#1. 참조하는 company 객체를 찾아 새로운 Recruitment 객체를 생성하고, company 객체를 연결지어 serialize한다
#2. RecruitmentSerializer의 is_valid 혹은 다른 메소드를 오버라이딩하여 request를 serializer로 전달하여 저장한다
#기타 등등
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)
공식 문서, 유튜브 영상, 외국 사이트등을 찾아보았지만 기존에 존재하던 테이블을 참조하며 새로운 객체를 저장하는 방법이 있질 않더군요... 혹시 해결 방법을 아시면 답변 부탁드리겠습니다.
참고로 request는
{
"company": {
"id": 1,
"company_name": "company1",
"nationality": "korea",
"region": "seoul"
},
"position": "백엔드",
"reward": 100000,
"info": "test",
"skill": "django"
} 이런식으로 생각하고 있습니다
답변 1
0
안녕하세요. 독자님.
클래스형뷰는 가장 먼저 어떤 제네릭뷰를 상속받을지 판단해야 되는데요.
class RecruitmentListView(APIView):
Recruitment 를 DB에 생성하는 것이므로 CreateAPIView 를 상속받는게 좋습니다.
뷰 이름은 안바꿔도 되지만 예시로 이렇게 되겠지요.
class RecruitmentCreateAPIView(CreateAPIView):
queryset = xxx
serializer_class = xxx
그리고 RecruitmentSerializer 에 create() 메소드를 작성해야 하는데,
아래 도큐먼트를 참고해서, update 메소드 예 이지만 create 로 응용해 보세요.
https://www.django-rest-framework.org/api-guide/serializers/#writing-update-methods-for-nested-representations
해보시고 안되면 다시 질문 올려주세요.
블로그 첫 화면이 안 나옵니다.
0
317
3
INSTALLED_APPS 순서
0
246
1
vscode 실행안됨
0
667
3
django venv activate 하고 나서 vue 서버도 실행 해야 하나요?
0
367
2
더 공부할게있을까요
0
369
1
용어에 대해 문의 드립니다.
0
283
2
like 기능을 위한 overriding 문의
0
322
1
코드 최적화 과정
0
364
1
유저 1명이 1개의 게시글에 좋아요를 누를 경우
0
356
1
프로잭트를 생성하고 runserver하면 ModuleNotFoundError: No module named 발생해요
0
894
4
GET Method 에서 왜 Like 수를 증가시키는지 궁금합니다.
0
376
1
CSRF Token에 대한 질문입니다.
0
609
1
ModuleNotFoundError: No module named 'rest_framework django' 오류
0
3037
1
앱을 구성할 때 api 앱과 blog 앱을 나누어서 구성하는 이유가 궁금합니다ㅜ
1
472
2
to_representation() 오버라이딩 질문입니다.
0
496
3
공부 순서에 관해 질문드립니다.
0
360
1
CateTagAPIView에서 get 메소드
1
309
2
깃헙 페이지를 보고싶어요
0
230
1
디버거 관련 질문입니다.
0
277
3
가장 마지막강의 (Generic View -> ViewSet migration) 질문입니다.
0
223
1
PostCommentListAPIView(게시물 댓글 조회 api) 관련 질문
0
211
1
댓글 보기 및 삭제 api
0
280
1
post, comment crud 질문
0
228
4
CateTagSerializer 질문입니다!
3
337
3





