-
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