미해결
파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
is_valid()과정에서 validated_data에 데이터가 유실됩니다
안녕하세요? 이렇게 빨리 질문을 다시 드릴 줄 몰랐네요 ㅠㅠ
is_valid()과정에서 데이터가 유실되는데, 도무지 이유를 모르겠어서 질문을 드립니다.
view 부분은 다음과 같습니다
(편의를 위해data를 그냥 따로 만들었습니다.
def perform_create(self, serializer):
data = {
'delivery_location': 'test_location',
'delivery_date': '2022-10-10',
'orderedproducts': [
{'product_id': 3, 'count': 3},
{'product_id': 4, 'count': 3}
],
}
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
print(serializer.validated_data)
serializer.save()
return serializer.data
여기서 print문의 결과로 다음과 같이 출력됩니다.orderedproducts내부에 있어야 할 product_id가 사라져 잇더라구요..아무리 검색해봐도 이유가 나오지 않아서 ㅠㅠ 한번 여쭈어 봅니다.
OrderedDict([('delivery_location', 'test_location'), ('delivery_date', datetime.date(2022, 10, 10)), ('orderedproducts', [OrderedDict([('count', 3)]), OrderedDict([('count', 3)])])])
혹시 몰라 시리얼라이저와 모델을 같이 적습니다.
시리얼라이저는 다음과 같습니다
class OrderedProductSerializer(serializers.ModelSerializer):
product_name = serializers.CharField(source='product.product_name',read_only=True)
class Meta:
model = OrderedProduct
fields = [
"product_id","count","product_name"
]
class PackageOrderSerializer(serializers.ModelSerializer):
orderedproducts = OrderedProductSerializer(many=True)
class Meta:
model = PackageOrder
fields = [
"id","delivery_location","delivery_date","is_packaging",
"orderedproducts"
]
def create(self,validated_data):
print("validated_data : ",validated_data)
orderedproducts_data = validated_data.pop('orderedproducts')
packageorder = PackageOrder.objects.create(**validated_data)
for products_data in orderedproducts_data:
OrderedProduct.objects.create(package_order=packageorder,**products_data)
return packageorder
모델은 다음과 같습니다
#models.py
class OrderedProduct(TimeStampedModel):
package_order = models.ForeignKey('PackageOrder',on_delete=models.CASCADE,related_name='orderedproducts')
product = models.ForeignKey('products.Product',on_delete=models.CASCADE)
count = models.BigIntegerField()
class Meta:
db_table = 'ordered_products'
class PackageOrder(TimeStampedModel):
delivery_location = models.CharField(max_length=100)
delivery_date = models.DateField()
is_packaging = models.CharField(max_length=100, blank=True,null=True)
class Meta:
db_table = 'package_orders'
OrderedProduct 모델이 다른 두개의 테이블을 참조하는 중간테이블처럼 사용되는 게 이유가 아닐까..짐작은 해보고 있습니다..
정 안되면 body데이터를 pop을 활용해 빼내고 context를 통해 데이터를 전해주는 방식을 사용할까 고민중이긴 한데
정확한 이유는 알고 싶어서 질문 드립니다.
감사합니다~