Как вернуть неполные ошибки тела в django?

class OrderViewSet(viewsets.ViewSet):
def list(self, request):
    orders = Order.objects.all()
    return Response({
      "code": "success",
      "orders": orders,
    })

def create(self, request):
    comment = request.data["comment"]
    product_id = request.data["product_id"]
    order = Order(comment=comment, product_id=product_id)
    order.save()
    return Response({
      "code": "success",
    })

Я хотел бы возвращать ошибку, если product_id не предоставлен пользователем в теле запроса:

"code": "invalid-request",
"details": {
  "product_id": {
    "type": "required",
    "message": "Product id is required",
   }
 }

Кроме того, есть KeyError, если комментарий не указан, но я не хочу делать комментарий обязательным в теле запроса. Как мне установить его в '', если он не был предоставлен & и при этом вернуть успех? Спасибо

Вам следует использовать serializers для реализации как валидации входных данных, так и сохранения модели. Обратите внимание, что в примере ниже используется общий serializers.Serializer, но вы, вероятно, захотите использовать serializers.ModelSerializer для валидации Order данных, поскольку он также будет обрабатывать создание модели.

class OrderSerializer(serializers.Serializer):
    product_id = serializers.IntegerField()
    comment = serializers.CharField(required=False, default='')

class OrderViewSet(viewsets.ViewSet):
    def list(self, request):
        orders = Order.objects.all()
        return Response({
          "code": "success",
          "orders": orders,
        })

    def create(self, request):
        serializer = OrderSerializer(data=request.data)
        if serializer.is_valid():
            order = Order(**serializer.validated_data)
            order.save()
            return Response({
                "code": "success",
            })
        return Response({
            "code": "invalid-request",
            "details": {
                error: {
                    "type": serializer.errors[error][0].code,
                    "message": serializer.errors[error][0]
                } for error in serializer.errors}
        }, status=400)
Вернуться на верх