如何在 Django 中验证 json 对象

How to validate a json object in django

我正在使用 AJAX 向 django 视图提交 JSON。 JSON 如下所示:

{
   "code":"9910203040", // required
   "name":"Abc", // required
   "payments":[
      {
         "amount":300, // required
         "name":"efg", // required,
         "type": 2 // can be empty
      },
      {
         "amount":100,
         "name":"pqr",
         "type": 3
      }
   ]
}

付款列表可以是任意大小的。我如何在 Django 中验证这一点?是否可以使用 Django Forms 来验证这一点?如果是 Spring,我会创建请求 类 并在字段上使用注释,但不知道如何在 Django 中执行此操作。

您可以使用 django rest 框架 [1] 它非常适合处理 json 请求。

为了验证数据,您可以使用序列化程序或 Django 表单。

使用表格:

@api_view(['POST'])
def my_view(request):
    payments = request.data.pop('payments', [])
    # validate the main object
    form = MyForm(request.data)
    if form.is_valid():
        obj = form.save()
    else:
        raise APIException(form.errors)
    for pdata in payments:
        form = PaymentForm(pdata)
        if form.is_valid():
            # your code
        else:
            raise APIException(form.errors)  
    return Response()

[1] http://www.django-rest-framework.org/

您可以使用 django rest 框架来验证请求数据,如@zaphod100.10 所述,

这是您可以用来验证的序列化器-

from rest_framework import serializers

class PaymentSerializer(serializers.Serializer):
    amount = serializers.IntegerField(required=True, min_value=0, null=True)
    name = serializers.CharField(required=True, max_length=128)
    type = serializers.IntegerField(required=True, min_value=0)

class ValidateFormSerializer(serializers.Serializer):
    code = serializers.CharField(required=True, max_length=32)
    name = serializers.CharField(required=True, max_length=128)
    payments = serializers.ListField(child=PaymentSerializer)

您需要像这样在视图部分验证它 -

 import ValidateFormSerializer

# add this snippet in your view section
 valid_ser = ValidateFormSerializer(data=request.data)
 if valid_ser.is_valid():
       post_data = valid_ser.validated_data
 else:
      print(valid_ser.errors)

如果足以解决您的问题,请告诉我。

有多种方法可以验证 json。我会列出以下内容:

  1. Marshmallow
  2. Schema Validation

如果您在使用这些方面需要任何帮助,请告诉我

您可以使用表单集。例如:

class UserForm(Form):
    code = forms.CharField()
    name = forms.CharField() 

class PaymentForm(Form):
    amount = forms.CharField()
    name = forms.CharField()
    type = forms.CharField()

class TestView(View):
    def post(self, request):
        response_data={}
        json_data=json.loads(request.body)
        UserFormSet = formset_factory(UserForm)
        userformset = UserFormSet(initial=[{'code' : json_data['code'], 'name' : json_data['name']}])
        PaymentFormSet = formset_factory(PaymentForm)
        paymentformset = PaymentFormSet(initial=json_data['payments'])
        for userform in userformset:
            #do something
        for paymentform in paymentformset:
            #do something
        return JsonResponse(response_data)