2016-06-09 67 views
0

嘗試發佈一些JSON我的API 串行:如何序列關係

from rest_framework import serializers 
from models import Order, OrderProduct, Delivery, Payments 

class DeliverySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Delivery 
     fields = ('delivery_time','delivery_adress','phone')#'id', 
    def create(self, validated_data): 
     """ 
     Create and return a new `Snippet` instance, given the validated data. 
     """ 
     return Delivery.objects.create(**validated_data) 


class PaymentsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Payments 
     #fields = (title) #'id', 
    def create(self, validated_data): 
     """ 
     Create and return a new `Snippet` instance, given the validated data. 
     """ 
     return Payments.objects.create(**validated_data) 



class OrderSerializer(serializers.ModelSerializer): 

    delivery = DeliverySerializer(required=False, allow_null=True) 
    paymentMethod = PaymentsSerializer(required=False, allow_null=True) 
    class Meta: 
     model = Order 
     fields = ('delivery', 'paymentMethod','summ','success') #'id', 

    def create(self, validated_data): 
     deliverys_data = validated_data.pop('delivery') 
     paymentsMethod_data = validated_data.pop('paymentMethod') 
     order = Order.objects.create(**validated_data) 
     Delivery.objects.create(order=order,**deliverys_data) 
     Payments.objects.create(order=order,**paymentsMethod_data) 
     return order 

查看:

api_view(['POST']) 
def order_post(request, format=None) 

    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) 

1時儘量把訂單數據庫中,我得到:

return Database.Cursor.execute(self, query, params) 
IntegrityError: order_order.delivery_id may not be NULL 

我只是試圖從字段中刪除id,將id添加到字段,結果是一樣的。

JSON:

{"delivery":{"delivery_time":"2016-05-31T12:18:47Z","delivery_adress":"123","phone":"123"},"paymentMethod":{"id":1,"title":"123124123"},"summ":"23","success":false} 

{"delivery":{"id":"1","delivery_time":"2016-05-31T12:18:47Z","delivery_adress":"123","phone":"123"},"paymentMethod":{"id":"1","title":"123124123"},"summ":"23","success":false} 

UPD1。 型號:

from __future__ import unicode_literals 

from django.db import models 

# Create your models here. 
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    
+0

從你回來''order'高清create'你不應該被分配'order.delivery = Delivery.objects.create(order =序列之前,** deliverys_data)'和'order.payment = Payments.objects.create(order = order,** paymentsMethod_data)'? –

+0

添加你的模特definition – Todor

+0

@todor已添加至帖子 – Weit

回答

1

你正在一個錯誤的順序做對象的創建,這就是爲什麼你IntegrityError: order_order.delivery_id may not be NULL。再次檢查你的模型結構:

Order機型都有ForeignKey'sDeliveryPayments,這意味着你需要Order之前創建DeliveryPayments對象

嘗試是這樣的:

def create(self, validated_data): 
    deliverys_data = validated_data.pop('delivery') 
    delivery = Delivery.objects.create(**deliverys_data) 

    paymentsMethod_data = validated_data.pop('paymentMethod') 
    payment_method = Payments.objects.create(**paymentsMethod_data) 

    order = Order.objects.create(
     delivery=delivery, 
     paymentMethod=payment_method, 
     **validated_data 
    ) 

    return order 
+0

Thanks,It works。但1問題:如果我想選擇創建的付款方式而不創建新的帳戶,該怎麼辦? – Weit

+1

您需要檢索它並將其傳遞給'Order.objects.create'。但是,您需要找到我們如何指示何時創建新付款以及何時不付款。例如。如果'paymentsMethod_data'中有'payment_id',那麼不要使用Payment.objects.get(pk = payment_id)來創建並檢索' – Todor