Сериализаторы Django: как запретить дополнительные поля?

Я использую сериализаторы Django для тестирования ответа API. Я обнаружил, что он позволяет использовать дополнительные поля:

from rest_framework import serializers

class ProjectSerializer(serializers.Serializer):
    name = serializers.CharField()

ProjectSerializer({'name': "Project A", "state": "active"}).is_valid()
# True
ProjectSerializer().to_internal_value(data={'name': "Project A", "state": "active"})
# OrderedDict([('name', 'Project A')])

Я хочу убедиться, что в ответе не будет других полей. Допустим, я ожидаю следующее:

data = {'name': "Project A", "state": "active"}
ProjectSerializer(data, extra='forbid').is_valid()
# False

Используя marshmallow я могу сделать это так:

from marshmallow import Schema, INCLUDE


class UserSchema(Schema):
    class Meta:
        unknown = RAISE

RAISE (по умолчанию): вызвать ошибку проверки, если есть неизвестные поля

С pydantic это будет выглядеть следующим образом:

from pydantic import BaseModel, ValidationError, Extra

class Model(BaseModel, extra=Extra.forbid):
    a: str

"запретить" приведет к тому, что валидация не пройдет, если будут включены дополнительные атрибуты включены


Есть ли какие-нибудь опции, которые я могу использовать в Django для этого?

Я не вижу необходимости делать это таким образом, да и rest-framework не ведет себя так, как вы описываете. Для подтверждения вы можете проверить параметр validated_data, который передается в метод create или update сериализатора. Только явно объявленные поля доступны в атрибуте validated_data (который используется для дальнейших операций crud)

Вернуться на верх