Вложенная проверка в Django Rest Framework - PullRequest
0 голосов
/ 06 декабря 2018

Используя django rest Framework, я хочу проверить поля.

Правильный запрос ввода:

{
   test_field_a: {test_field_c: 25}, 
   test_field_b: {}
}

Мой serializers.py (У меня нет связанныхмодели и сам models.py):

from rest_framework import serializers
class TestSerializer(serializers.Serializer):
  test_field_a = serializers.JSONField(label='test_field_a', allow_null=False, required=True)
  test_field_b = serializers.JSONField(label='test_field_b', required=True)
  test_field_c = serializers.IntegerField(label='test_field_c)

Неправильный запрос ввода (в котором должно быть указано, что поле int является обязательным):

{
   test_field_a: {test_field_c: 'wrong'}, 
   test_field_b: {}
} 

Теперь test_field_a и test_field_b подтверждены в соответствии с требованиями.Но как сделать проверку полей на разных уровнях запроса?(в данном случае test_field_c)

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

JSONField сериализатора не имеет проверки для вложенных полей, потому что он не предназначен для вложения явно объявленных полей, и, насколько я знаю, в настоящее время нет способа указать схему json для ее проверки.Что вы можете сделать, так это проверить поле самостоятельно, объявив validate_test_field_a метод проверки.

Например:

    def validate_test_field_a(self, value):
        if 'test_field_c' not in value:
            raise serializers.ValidationError('`test_field_c` is required')
        return value

Как правило, если вам нужно проверить вложенный тип внутри JSONField, это признак плохой архитектуры, и вам следует рассмотреть вместо этого использование вложенных сериализаторов.,То же относится и к использованию JSONField в модели

0 голосов
/ 06 декабря 2018

JSONField просто проверяет, что поле содержит правильную структуру JSON.Вам нужно сделать это плюс проверить значения из этого JSON.

Есть несколько способов сделать это:

  1. Вы можете написать свой собственный тип настраиваемого поля (хорошо, если вы планируете сделать что-то подобное в других сериализаторах);
  2. Вы можете изменить проверка поля (попробуйте что-то вроде этого):

    from rest_framework import serializers
    
    class TestSerializer(serializers.Serializer)::
        test_field_a = serializers.JSONField(label='test_field_a', allow_null=False, required=True)
        test_field_b = serializers.JSONField(label='test_field_b', required=True)
    
        def validate_test_field_a(self, value):
            """
            Check that test_field_a .
            """
            if not isinstance(value.get('test_field_c'), int):
               raise serializers.ValidationError("Some error message")
           return value
    
  3. Вы можете попробовать вложенную проверку :

    from rest_framework import serializers
    
    
    class Test1Serializer(serializers.Serializer):
        test_field_c = serializers.IntegerField(label='test_field_c')
    
    
    class TestSerializer(serializers.Serializer):
        test_field_a = Test1Serializer()
        test_field_b = serializers.JSONField(label='test_field_b', required=True)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...