ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DRF - Serializer custom create
    개발일지 2022. 6. 19. 14:26

     

    Django DRF 사용시 Serializer에서 custom create를 실행할때 

     

    input 값을 id 값으로 받아도 ForeignKey의 경우 그대로 모델을 가져온다. 

     

     

    models.py

    class Product(models.Model):
        # 작성자, 썸네일, 상품 설명, 등록일자, 노출 종료 일자, 가격, 수정 일자, 활성화 여부
        writer = models.ForeignKey(User, on_delete=models.CASCADE)
        thumbnail = models.ImageField()
        desc = models.CharField(max_length=1000)
        expose_end = models.DateTimeField()
        cost = models.IntegerField()
        created_at = models.DateTimeField(auto_now_add=True)
        update_at = models.DateTimeField(auto_now=True)
        active = models.BooleanField(default=False)

     

    request Body - form-data

     

     

    serializer.py

    처음 작성  >>>  Error 발생

        def create(self, validated_data):
            print('create!')
            user_pk = validated_data.pop('writer')
            user = User.objects.filter(pk=user_pk)
            print(f'input is id but writer class is {type(user_pk)}')
            print(f'user is {user}')
            
            product = Product(**validated_data)
            product.writer = user
            product.save()
            
            return product

    예상 결과 

    create!
    input is id but writer class is 13
    user is <models.User>

     

    실제 결과 - Error

    TypeError: Field 'id' expected a number but got <User: user2>.

     

     

     

    원인 코드 

    user = User.objects.filter(pk=user_pk)

    user_pk 가 number 가 아니라 User class이다 

    따라서 request body 에서 받아온 wrtier는 number 인 13 인데 validaion 하는 과정에서 user로 변경 된것 같다. 

     

     

     

     

     

    수정 후 

        def create(self, validated_data):
            print('create!')
            user = validated_data.get('writer')
            print(f'input is id but writer class is {type(user)}')
            
            product = Product(**validated_data)
            product.save()
            return product

    결과 

    create!
    input is id but writer class is <class 'user.models.User'>

     

    따라서 create를 custom 하는 과정에서 해당 Field에 없는 값이 아니면 validation  하는 과정에서 해당 모델로 바꿔준다. 

    그래서 ForeignKey로 묶인 모델을 따로 넣을 필요가 없다. 

    '개발일지' 카테고리의 다른 글

    Django Channels 사용법 - 공식 문서  (0) 2022.06.21
    DRF - VIEW 종류  (0) 2022.06.20
    Django - OneToOneField, ForeignKey, ManyToManyField  (0) 2022.06.16

    댓글

Designed by Tistory.