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

devnull
  • 393
  • 4
  • 20
  • Duplicate, question: https://stackoverflow.com/questions/37629501/django-rest-framework-listfield-and-dictfield – devnull Sep 04 '18 at 14:16

3 Answers3

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={})
2

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:

devnull
  • 393
  • 4
  • 20
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!

devdob
  • 1,404
  • 12
  • 13
  • Сan so validate JSON via serializers? example (pseudocode): https://gist.github.com/skar404/dea94749bcfcf2aa165e6e701d18a7fa – devnull Sep 04 '18 at 13:34
  • Yes you can. Check the answer from @tom here https://stackoverflow.com/questions/44085153/how-to-validate-a-json-object-in-django – devdob Sep 04 '18 at 13:43
  • exception: `AssertionError: \`child\` has not been instantiated.` (Django==2.1, djangorestframework==3.8.2) – devnull Sep 04 '18 at 13:49
  • im not really sure what you did to get this error. I can try to help if you show me some more code. – devdob Sep 04 '18 at 13:53
  • code: https://gist.github.com/skar404/dea94749bcfcf2aa165e6e701d18a7fa#file-serializers_2-py – devnull Sep 04 '18 at 13:55