Сериализаторы 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)