Nayan
Nayan

Reputation: 1605

How to validate a json object in django

I'm submitting a JSON to a django view with AJAX. The JSON looks like the following:

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

The payments list can be of any size. How can I validate this in Django? Is it possible to use Django Forms to validate this? If it was Spring, I would create Request classes and use annotations on fields but can't figure out how to do this in Django.

Upvotes: 8

Views: 18909

Answers (4)

ABN
ABN

Reputation: 1152

You can use formsets. For example:

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)

Upvotes: 0

Mohammad Mustaqeem
Mohammad Mustaqeem

Reputation: 1084

There are a number of ways to validate json. I would list following:

  1. Marshmallow
  2. Schema Validation

Let me know if you need any help in using these

Upvotes: 3

theguru42
theguru42

Reputation: 3378

you can use django rest framework [1] it is very good for handling json requests.

for validating data you can use a serializer or a django form.

using a form:

@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/

Upvotes: 0

anoop-khandelwal
anoop-khandelwal

Reputation: 3860

You can use django rest framework to validate request data as mentioned by @zaphod100.10 ,

here is the serializer you can use to validate-

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)

You need like this to validate it in the view section -

 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)

Let me know, if it is enough to solve your problem.

Upvotes: 22

Related Questions