Проверка параметров POST с помощью сериализаторов в Django

Я пытаюсь реализовать простой валидатор для своих параметров 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)

Но что бы я ни делал с данными, они отображаются как действительные без ошибок. Есть ли еще код, который мне нужно добавить в сериализатор для проверки?

Этот вопрос похож на: Как проверить аргументы Post в Django. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

ViAchKoN 03.07.2024 20:51

Это был мой вопрос. Я получил первоначальный ответ, но у меня все еще есть проблема с вызовом is_valid().

Peter Kronenberg 03.07.2024 21:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем сериализаторе почти незаметная синтаксическая ошибка. Поля сериализатора следует добавлять «автономно», вам не нужны (и не следует использовать) конечные запятые. По неизвестным мне причинам это мешает сериализатору правильно обрабатывать поля.

Вот отдельное доказательство концепции:

# 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, без ошибок. Я не думаю, что конечные запятые имели к этому какое-то отношение. Весь импорт правильный. Не могу себе представить, что это может быть

Peter Kronenberg 03.07.2024 23:13

Я добавил к ответу, что получу, если использую конечные запятые в определении сериализатора, так что это определенно одна из ошибок. Но как и почему проблема с измененным кодом сохраняется, на данный момент мне немного непонятно — я не могу придумать какой-либо очевидной причины, по которой это могло бы произойти.

Vegard 03.07.2024 23:22

О, пропустил твой последний тест, где ты показываешь запятые в конце, сломал его. Странно, но у меня их там больше точно нет.

Peter Kronenberg 03.07.2024 23:22

Я предполагаю, что мне не нужно ничего особенного в файле settings.py или что-то в этом роде, верно? Просто пытаюсь выяснить, что может отличаться от моего окружения.

Peter Kronenberg 03.07.2024 23:48

Нет необходимости settings.py, насколько я знаю - у меня и так нет ничего особенного для DRF. Я предполагаю, что вы смотрите на вывод печати в своей консоли, а не на вывод какого-то другого клиента? Потому что, если это внешний клиент, возможно, задействовано кеширование, и «неправильный» ответ может быть кэшированным.

Vegard 04.07.2024 03:38

Ага, смотрю как в консоль, так и в Postman. Я тоже подумал о проблеме с кешированием. Даже закончил Pycharm и перезапустил

Peter Kronenberg 04.07.2024 04:49

Другие вопросы по теме