如何在 django 中验证 json 对象

Posted

技术标签:

【中文标题】如何在 django 中验证 json 对象【英文标题】:How to validate a json object in django 【发布时间】: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 中执行此操作。

【问题讨论】:

试试json.loads():***.com/a/5508552和Django validators。 【参考方案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。我会列出以下内容:

    Marshmallow 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)

【讨论】:

以上是关于如何在 django 中验证 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何遍历 html 中的嵌套 Json 对象

Django 表单字段验证 - 如何判断操作是插入还是更新?

如何在 C# 中验证 JSON 对象中列表的条件

如何在 Django 中将搜索查询结果转换为 Json 可序列化对象

如何在 Django 中序列化(JSON)文件字段

通过 Flutter App 和 JSON Web Token 在 Django 中验证用户