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}] 
  • one
    In your OrderSerializer, the delivery and paymentMethod fields are marked as read_only = "read-only", of course they are not in validated_data. - Chikiro
  • @Chikiro without this field I get "non_field_errors": ["Invalid data. Expected a dictionary, but got list." ] - Weit
  • So you transfer the list from one dictionary, transfer only the dictionary, without wrapping it in the list. - Chikiro pm
  • @Chikiro I am transmitting now {"delivery": {"delivery_time": "2016-05-31T12: 18: 47Z", "delivery_adress": "123", "phone": "123"}, "paymentMethod": {"id ": 1," title ":" 123124123 "}," summ ":" 23 "," success ": false} returns 500 with an error return Database.Cursor.execute (self, query, params) IntegrityError: order_order.delivery_id may not be NULL - Weit
  • one
    Now we need to look at the logic of saving models. First you need to save the delivery, then substitute the id in order.delivery_id and save the order. - Chikiro

0