Django:处理 post JSON 请求

Django : handle post JSON requests

我需要用 django 处理一些 JSON 数据。 我将收到此数据:

{
    "user": 8,
    "orderDay": "2020-06-24",
    "deliveryDay": "2020-06-30",
    "deliveryAddress": "Place des Fêtes",
    "comment": "",
    "orderDetail": 
    [
        {
            "product": 2,
            "byProduct": 2,
            "quantity": 43
        },
        {
            "product": 3,
            "byProduct": 3,
            "quantity": 5
        }
    ]
}

我想将此数据保存在 3 个不同的 table 中:orderorderDetailmodels.py:

class order(models.Model):
    user = models.ForeignKey(memberArea, on_delete=models.CASCADE)
    comment = models.TextField(null=True, blank=True)
    orderDay = models.DateTimeField(auto_now_add=True)
    deliveryDay = models.DateField()
    deliveryPlace = models.CharField(max_length=255)
    state = models.CharField(max_length=255)
    price = models.TextField(null=True, blank=True)
    response = models.TextField(null=True, blank=True)
...
class orderDetail(models.Model):
    order = models.ForeignKey(order, on_delete=models.CASCADE)
    product = models.ForeignKey(product, on_delete=models.CASCADE)
    byProduct = models.ManyToManyField(byProduct)
    quantity = models.CharField(max_length=255)
...
class byProduct(models.Model):
    product = models.ForeignKey(product, on_delete = models.CASCADE)
    name = models.CharField(max_length=255)
...
class product(models.Model):
    name = models.CharField(max_length=255)
    prix_uni = models.TextField(null=True, blank=True)
    prix_kg = models.TextField(null=True, blank=True)
    dispo = models.BooleanField(null=True, blank=True)
    category = models.ForeignKey(category, on_delete=models.CASCADE)
    redu = models.TextField(null=True, blank=True)

我找不到任何关于如何使用 Django 处理 JSON 数据的好文档。 提前致谢

更新

我试过这样的事情: serializer.py:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = product
        fields = '__all__'

class ByProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = byProduct
        fields = '__all__'

class orderDetailSerializer(serializers.ModelSerializer):

    order = serializers.PrimaryKeyRelatedField(many=False, queryset=order.objects.all())

    class Meta:
        model = orderDetail
        fields = '__all__'

class OrderSerializer(serializers.ModelSerializer):

    orderDetail = orderDetailSerializer(many=True)

    class Meta:
        model = order
        fields = ['user', 'comment', 'deliveryDay', 'deliveryAddress', 'orderDetail']

    def create(self, validated_data):
            order_detail_data = validated_data.pop('orderDetail')
            new_order = order.objects.create(**validated_data)
            new_order.save()
            for product in order_detail_data:
                order_detail = orderDetail.objects.create(**product)
                order_detail.order.add(new_order.id)
            
            return new_order

views.py:

@api_view(['POST'])
def order(request, format=None):
    if request.method == 'POST':
        serializer = OrderSerializer(data=request.data)
        data = {}
        if serializer.is_valid():
            serializer.save()
            data['response'] = "Your order went well"
            return Response(data)
        return Response(serializer.errors)

您需要做的更改很少。

  1. 更改数据格式:
{
    "user": 8,
    "orderDay": "2020-06-24",
    "deliveryDay": "2020-06-30",
    "deliveryAddress": "Place des Fêtes",
    "comment": "",
    "orderDetail": 
    [
        {
            "product": 2,
            "byProduct": [2],
            "quantity": 43
        },
        {
            "product": 3,
            "byProduct": [3],
            "quantity": 5
        }
    ]
}

byProduct 是一个 ManyToMany 字段,因此它必须有一个产品列表。

  1. 在你的 orderDetailSerializer:
class orderDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = orderDetail
        fields = ['product', 'byProduct', 'quantity']

请注意,在 fields 中我没有包含 order,因为在我们的数据中没有这样的字段,因此出现错误 order field is required。这很简单,因为序列化器会解析我们发送的数据,如果有什么东西丢失了,它会通知我们。

  1. orderSerializer 的变化:
class OrderSerializer(serializers.ModelSerializer):

    orderDetail = orderDetailSerializer(many=True)

    class Meta:
        model = order
        fields = ['user', 'comment', 'deliveryAddress', 'deliveryDay', 'orderDetail']

    def create(self, validated_data):
            order_detail_data = validated_data.pop('orderDetail')
            new_order = order.objects.create(**validated_data)
            # new_order.save()
            for product in order_detail_data:
                by_products = product.pop('byProduct')
                order_detail = orderDetail.objects.create(order=new_order, **product)
                order_detail.byProduct.set(by_products)
                order_detail.save()

            return new_order

有几点需要注意,fields 包括 orderDetail 虽然它不是 order 模型的一部分,但是为了解析传递的数据,我们需要添加这样的字段, 如果还有更多。在create方法byProduct里面是一个ManyToMany字段,所以我们必须使用set()方法来分配它们,direct assignment是不允许的。