I am trying to serialize a complex model:
Model:
class Order (models.Model): id = models.AutoField(primary_key=True) date_create = models.DateField(auto_now_add=True) date_change = models.DateField(auto_now=True) summ =models.CharField(max_length=15,default='0') delivery = models.ForeignKey('Delivery') success = models.BooleanField(default=False) paymentMethod = models.ForeignKey('Payments') def __unicode__(self): return unicode(self.id) class OrderProduct(models.Model): order=models.ForeignKey('Order') id = models.AutoField(primary_key=True) date_create = models.DateField(auto_now_add=True) date_change = models.DateField(auto_now=True) price = models.IntegerField() product = models.ForeignKey('product.Product') additionals = models.IntegerField(null=True,default=0) count = models.IntegerField() def __unicode__(self): return self.id class Delivery(models.Model): id = models.AutoField(primary_key=True) date_create = models.DateField(auto_now_add=True) date_change = models.DateField(auto_now=True) delivery_time = models.DateTimeField() delivery_adress = models.TextField() phone = models.TextField() def __unicode__(self): return self.phone class Payments(models.Model): id = models.AutoField(primary_key=True) date_create = models.DateField(auto_now_add=True) date_change = models.DateField(auto_now=True) title = models.TextField(); def __unicode__(self): return self.title Serializers:
class DeliverySerializer(serializers.ModelSerializer): class Meta: model = Delivery fields = ('id', 'delivery_time','delivery_adress','phone') def create(self, validated_data): return Delivery.objects.create(**validated_data) class PaymentsSerializer(serializers.ModelSerializer): class Meta: model = Payments fields = ('id', 'title') def create(self, validated_data): return Payments.objects.create(**validated_data) class OrderSerializer(serializers.ModelSerializer): delivery = DeliverySerializer(read_only=True) paymentMethod = PaymentsSerializer(read_only=True) class Meta: model = Order fields = ('id', 'delivery', 'paymentMethod','summ','success') def create(self, validated_data): deliverys_data = validated_data.pop('delivery') paymentsMethod_data = validated_data.pop('paymentMethod') order = Order.objects.create(**validated_data) for delivery_data in deliverys_data: Delivery.objects.create(order=order, **delivery_data) for paymentMethod_data in paymentsMethod_data: Payments.objects.create(order=order, **paymentMethod_data) return order View:
@api_view(['POST']) def order_post(request, format=None): #List all snippets, or create a new snippet. if request.method == 'POST': serializer = OrderSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) It is necessary for me that the data that come in one packet correctly with all the links are recorded in the database.
Every time sending json I get an error:
deliverys_data = validated_data.pop('delivery')KeyError: 'delivery'
JSON example:
[{"delivery":{"delivery_time":"2016-05-31T12:18:47Z","delivery_adress":"123","phone":"123"},"paymentMethod":{"id":1,"title":"123124123"},"summ":"23","success":false}]