【问题标题】:django REST framework, validate json datadjango REST框架,验证json数据
【发布时间】:2019-02-09 13:02:42
【问题描述】:

服务器自带json格式:

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

如何使用 django REST framework 来验证这个 json?

ru版本

【问题讨论】:

标签: json django django-rest-framework


【解决方案1】:

您可以像这样使用 django rest 框架编写自己的验证器,

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)

您可以找到更多详情here

希望这会有所帮助!

【讨论】:

【解决方案2】:

例子:

# 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_ser.data
{
    "type": "str",
    "object": {
        "lead_id": 123,
        "group_id": 12345,
        "user_id": 12352,
        "form_id": 1
    },
    "group_id": 5123,
    "secret": "str"
}

答案非常有帮助:

【讨论】:

    【解决方案3】:
    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={})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2013-06-29
      • 2017-09-26
      • 2017-11-02
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多