Я пытаюсь реализовать простой валидатор для своих параметров POST.
Мой ввод выглядит следующим образом:
{
"gage_id": "01010000",
"forcing_source":"my_source",
"forcing_path":"my_path"
}
У меня есть следующий сериализатор:
class SaveTab1Serializer(Serializer):
gage_id = CharField(min_length=1, required=True),
forcing_source = CharField(min_length=1, required=True),
forcing_path = CharField(min_length=1, required=True),
И я использую это так:
@api_view(['POST'])
def save_tab1(request):
body = json.loads(request.body)
ser = SaveTab1Serializer(data=body)
print('serializer', ser.is_valid())
print('errors', ser.errors)
Но что бы я ни делал с данными, они отображаются как действительные без ошибок. Есть ли еще код, который мне нужно добавить в сериализатор для проверки?
Это был мой вопрос. Я получил первоначальный ответ, но у меня все еще есть проблема с вызовом is_valid().
В вашем сериализаторе почти незаметная синтаксическая ошибка. Поля сериализатора следует добавлять «автономно», вам не нужны (и не следует использовать) конечные запятые. По неизвестным мне причинам это мешает сериализатору правильно обрабатывать поля.
Вот отдельное доказательство концепции:
# test.py
import json
from rest_framework import serializers
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
class SaveTab1Serializer(serializers.Serializer):
gage_id = serializers.CharField(min_length=2, required=True)
forcing_source = serializers.CharField(min_length=2, required=True)
forcing_path = serializers.CharField(min_length=2, required=True)
@api_view(['POST'])
@permission_classes([AllowAny])
def save_tab1(request):
body = json.loads(request.body)
ser = SaveTab1Serializer(data=body)
print('serializer', ser.is_valid())
print('errors', ser.errors)
return Response({ "data": body, "data_is_valid": ser.is_valid(), "data_errors": ser.errors })
# urls.py
path('test/', save_tab1, name='test'),
Для сравнения, вот то же выполнение, но с завершающими запятыми:
Что ж, что-то не так, потому что я получаю те же результаты с вашим тестом. Скопировал именно то, что у вас есть, в отдельный файл и добавил путь к моему urls.py
. Тем не менее всегда возвращает true, без ошибок. Я не думаю, что конечные запятые имели к этому какое-то отношение. Весь импорт правильный. Не могу себе представить, что это может быть
Я добавил к ответу, что получу, если использую конечные запятые в определении сериализатора, так что это определенно одна из ошибок. Но как и почему проблема с измененным кодом сохраняется, на данный момент мне немного непонятно — я не могу придумать какой-либо очевидной причины, по которой это могло бы произойти.
О, пропустил твой последний тест, где ты показываешь запятые в конце, сломал его. Странно, но у меня их там больше точно нет.
Я предполагаю, что мне не нужно ничего особенного в файле settings.py или что-то в этом роде, верно? Просто пытаюсь выяснить, что может отличаться от моего окружения.
Нет необходимости settings.py
, насколько я знаю - у меня и так нет ничего особенного для DRF. Я предполагаю, что вы смотрите на вывод печати в своей консоли, а не на вывод какого-то другого клиента? Потому что, если это внешний клиент, возможно, задействовано кеширование, и «неправильный» ответ может быть кэшированным.
Ага, смотрю как в консоль, так и в Postman. Я тоже подумал о проблеме с кешированием. Даже закончил Pycharm и перезапустил
Этот вопрос похож на: Как проверить аргументы Post в Django. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.