【问题标题】:How to validate a json object in django如何在 django 中验证 json 对象
【发布时间】:2017-10-20 11:24:48
【问题描述】:

我正在使用 AJAX 将 JSON 提交到 django 视图。 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,我会创建 Request 类并在字段上使用注释,但不知道如何在 Django 中执行此操作。

【问题讨论】:

标签: django django-validation


【解决方案1】:

您可以使用 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)

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

【讨论】:

  • 我没有在我的项目中使用 django rest 框架。有替代品吗?
  • 检查docs.djangoproject.com/en/1.11/ref/forms/validation,有什么不使用django rest框架的具体原因吗?
  • 实际上不是。我有一个单一的视图函数,它接受像上面这样的复杂 JSON 请求。所有其他视图都是纯表单提交。我只是想知道是否有一种优雅的方式可以使用 django 内置 api 来做到这一点。
  • 我在我的项目中使用 django rest-framework。谢谢您的回答。但是我已经对其进行了一些编辑以匹配当前的 api 文档。
【解决方案2】:

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

  1. Marshmallow
  2. Schema Validation

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

【讨论】:

    【解决方案3】:

    你可以使用 django rest framework [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/

    【讨论】:

    • 如何编写可以验证对象列表的表单类?
    • 您可以遍历列表并验证每个对象。让我编辑答案以说明如何。
    【解决方案4】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 2011-07-03
      • 2021-05-18
      • 1970-01-01
      • 2017-10-15
      • 2015-10-24
      • 2012-01-15
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多