【问题标题】:Django rest insert orderDjango休息插入顺序
【发布时间】:2018-10-10 09:04:09
【问题描述】:

我在 Django 中使用 rest 框架做一个小项目,但我已经到了不知道如何继续的地步。

在应用程序中,我的客户可以订购食物或饮料,然后将其添加到订单中。我有以下型号:

订单

    order_id = models.AutoField(primary_key = True)
    customer = models.ForeignKey(Customers, on_delete = None)
    date = models.DateTimeField(auto_now_add=True)

模型 Customers 只是来自 User 模型的 OneToOneField。

食品订单

    fake_id = models.AutoField(primary_key = True)
    order_id = models.ForeignKey(Orders, on_delete = models.CASCADE)
    food_id = models.ForeignKey(Food, on_delete = models.CASCADE)
    quantity = models.IntegerField()

饮料订单

    fake_id = models.AutoField(primary_key = True)
    order_id = models.ForeignKey(Orders, on_delete = models.CASCADE)
    drink_id = models.ForeignKey(Drink, on_delete = models.CASCADE)
    quantity = models.IntegerField()

因此,考虑到我的模型,首先我需要创建一个订单,然后为订单中的每个项目创建一个食品订单或饮料订单。我遇到的问题是我什至无法创建订单。我创建了一个序列化程序和一个视图,用邮递员传递数据,什么也没有,我总是得到一个错误。

我的序列化器:

class OrdersSerializer(serializers.Serializer):
    customer = UserSerializer()
    date = serializers.DateTimeField()

    class Meta:
        model = Orders

    def create(self, validated_data):
        order = Orders.objects.create(**validated_data)
        order.save()
        return order

我的看法:

@api_view(['POST'])
def createOrder(request):
    ser = OrdersSerializer(data=request.data)

    if ser.is_valid():
        ser.save()
        return Response(ser.data, status=status.HTTP_201_CREATED)
    else:
        return Response(ser._errors, status=status.HTTP_400_BAD_REQUEST)

这是我要发送的有效负载:

{
"date": [{
    "date": "2013-01-29T12:34:56.000000Z"
}],
"customer": {
    "id": [{
        "id":1
    }]
}
}

这是我得到的回应:

{
"customerID": {
    "id": [
        "A valid integer is required."
    ]
},
"date": [
    "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]."
]
}

我觉得这可能是有效载荷的问题,但我一直在努力让它工作但无济于事。

【问题讨论】:

    标签: django python-3.x django-rest-framework django-serializer


    【解决方案1】:

    好像你的payload多了一层嵌套...应该是

    {
        "date": "2013-01-29T12:34:56.000000Z",
        "customer": {
            "id":1
        }
    }
    

    这应该类似于ser.data的输出

    附带说明,如果这些是您的实际模型,您可能希望将 ForeignKey 字段重命名为没有 _id 后缀...
    Django 将自动创建一个带有_id(在您的情况下为order_id_id)的隐藏字段,它是db 字段,并且没有_id 后缀的字段名称将是一个实际的模型对象。因此,在您的情况下,order_id 将是 Order 对象,而不是 id。这可能会令人困惑。

    【讨论】:

      【解决方案2】:

      负载格式不正确。这应该是正确的格式:

      {
        "customer": { "id": 1 },
        "date": "2018-09-04 06:00:00.000000+05:30"
      }
      

      另外,您需要确保数据库中存在id=1 的客户。

      【讨论】:

        猜你喜欢
        • 2013-10-03
        • 2011-09-05
        • 2015-09-17
        • 2015-06-30
        • 1970-01-01
        • 2019-05-01
        • 2021-11-26
        • 1970-01-01
        • 2013-04-08
        相关资源
        最近更新 更多