如何在 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()
您可以使用 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。我会列出以下内容:
如果您在使用这些方面需要任何帮助,请告诉我
您可以使用表单集。例如:
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)
我正在使用 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()
您可以使用 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。我会列出以下内容:
如果您在使用这些方面需要任何帮助,请告诉我
您可以使用表单集。例如:
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)