inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Django REST Framework 핵심사항

DRF 1:N 참조 테이블 객체 매핑 POST

380

Jay

작성한 질문수 2

0

 
안녕하세요. 현재 drf 를 사용하여 api 개발을 공부중입니다.
현재 1:n 관계인 두개의 테이블에서 N측 테이블의 데이터를 저장할 때 기존에 존재하던 1측 테이블의 레코드와 관계를 생성하여 매핑하고자 합니다. 이런 저런 방법을 계속 시도하였으나 참조하는 테이블의 객체를 알맞게 매핑하는데 자꾸 실패하여 질문을 남깁니다.
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"
    } 이런식으로 생각하고 있습니다

drf django rest-api

답변 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