10

The server comes with json format:

{
    "type": "string",
    "object": {
        "lead_id": int,
        "form_name": "string",
        "answers": [
            {
                "lead_id": int,
                "key": "string",
            }
            ...
        ]
    },
    "group_id": int,
    "secret": "string"
}

How to use django REST framework to validate this json?

ru version

1

3 Answers 3

4
class AnswersSerializer(serializers.Serializer):
    lead_id = serializers.IntegerField(required=True)
    key = serializers.CharField(max_length=100)

class ObjectSerializer(serializers.Serializer):
    lead_id = serializers.IntegerField(required=True)
    form_name = serializers.CharField(max_length=100)
    answers = serializers.ListField(child=AnswersSerializer())

class UpdateGroup(serializers.Serializer):
    group_id = serializers.IntegerField(required=True)
    type = serializers.CharField(max_length=100)
    secret = serializers.CharField(max_length=100)
    object = serializers.DictField(child=, default={})
Sign up to request clarification or add additional context in comments.

Comments

3

Example:

# serializers.py
from rest_framework import serializers


class VkObjectSerializer(serializers.Serializer):
    """
    is 'object'
    """
    lead_id = serializers.IntegerField()
    group_id = serializers.IntegerField()
    user_id = serializers.IntegerField()
    form_id = serializers.IntegerField()


class VkBaseSerializer(serializers.Serializer):
    """
    Base serializer 
    """
    type = serializers.CharField(max_length=200)

    object = VkObjectSerializer()

    group_id = serializers.IntegerField()
    secret = serializers.CharField(max_length=200)

# view.py
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from .serializers import VkBaseSerializer


class VkCallbackView(CreateAPIView):
    serializer_class = VkBaseSerializer

    def create(self, request, *args, **kwargs):
        """
        Method is validate json in view
        """
        valid_ser = self.serializer_class(data=request.data)
        if valid_ser.is_valid():
            return Response('True')
        return Response('False')

Valid data:

>>> valid_ser.data
{
    "type": "str",
    "object": {
        "lead_id": 123,
        "group_id": 12345,
        "user_id": 12352,
        "form_id": 1
    },
    "group_id": 5123,
    "secret": "str"
}

The answers were very helpful:

Comments

1

You can use django rest framework to write you own validators like so,

class MultipleOf(object):
   def __init__(self, base):
       self.base = base

   def __call__(self, value):
       if value % self.base != 0:
           message = 'This field must be a multiple of %d.' % self.base
           raise serializers.ValidationError(message)

You can find more details here

Hope this helps!

5 Comments

Сan so validate JSON via serializers? example (pseudocode): gist.github.com/skar404/dea94749bcfcf2aa165e6e701d18a7fa
Yes you can. Check the answer from @tom here stackoverflow.com/questions/44085153/…
exception: AssertionError: `child` has not been instantiated. (Django==2.1, djangorestframework==3.8.2)
im not really sure what you did to get this error. I can try to help if you show me some more code.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.