【问题标题】:Django : Add JSON POST data into the databaseDjango:将 JSON POST 数据添加到数据库中
【发布时间】:2020-10-25 22:12:59
【问题描述】:

我正在尝试为屠夫制作 API。 有了这个API和我接下来要搭建的网站,客户就可以远程下单了。 这是我的问题。 使用订单,客户端向我发送 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
        }
    ]
}

这些数据必须保存在数据库中。 这些是我使用的模型:models.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()
    deliveryAddress = 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.ForeignKey(byProduct, on_delete=models.CASCADE)
    quantity = 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)

class byProduct(models.Model):
    product = models.ForeignKey(product, on_delete = models.CASCADE)
    name = models.CharField(max_length=255)

我制作了这样的序列化程序文件 serializer.py

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', '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:
                order_detail = orderDetail.objects.create(order=new_order, **product)
                new_order.orderDetail.add(order_detail.id)
            
            return new_order

这是我的观点:views.py

#Make an order
@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)

当我尝试运行我的代码时,它告诉我订单数据丢失:

{
    "orderDetail": [
        {
            "order": [
                "This field is required."
            ]
        },
        {
            "order": [
                "This field is required."
            ]
        }
    ]
}

我不知道如何添加它,因为我需要的 order_id 是在 orderDetail.xml 的同时创建的。 提前感谢您对我的帮助。

【问题讨论】:

    标签: python json django api django-rest-framework


    【解决方案1】:

    你应该在orderDetailSerializer中设置order字段readonly

    class orderDetailSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = orderDetail
            fields = '__all__'
            read_only_fields = ('order',)
            
    

    【讨论】:

    • 当我创建这个字段read_only 时,我得到这个错误:AssertionError: Relational fields should not provide a queryset` 参数,当设置 read_only=True.`
    • 你是真正的mvp :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2017-07-14
    • 2017-03-07
    • 1970-01-01
    • 2016-03-09
    • 2021-11-17
    • 2019-05-05
    相关资源
    最近更新 更多