vasi.che
Что-то как-то все замороченно. Я себе представлял нечто такое:
Тоже вполне себе реализуемо. Хотя и до конца не понятно, зачем вам тогда вообще рест фреймворк (да и джанго)
Если пользоваться терминами рест фреймворка, то ваши сущности `validator`, `processor` и `serializator` вполне себе мапятся в `InputSerializer`, `viewset.action` и `OutputSerializer`. Для большинства кейсов сериализатор будет вообще общим.
Кроме того, рест фреймворк позволяет очень быстро реализовать тупейший CRUD+L с возможностью переопределения конкретных действий и/или дополнения парадигмы CRUD, создания каких-либо rest-rpc или чего-либо другого.
Он создавался больше с целью максимально быстро принимать/отдавать имеющиеся в орм модели без лишних затрат на разработку.
В общем случае, если у вас есть какая-то модель, и вам нужно их просто персистить/читать, вы получаете и сериализаторы, и сам вьюсет практически бесплатно, поскольку он умеет строить их автоматически на основе моделей.
А если нужно что-то кастомное - это всегда можно переопределить.
PS. СamelCase в питонячьих гаедлайнах применяется только в именовании класса, в именовании методов и переменных рекомендуется snake_case.
PPS. Чтобы замапить кемелкейс сериализатора в аттрибут модели, можно использовать kwarg `source`, например:
class SomeSerializer(serializers.ModelSerializer):
class Meta:
model = models.SomeModel
fields = (
'id',
'attribute',
'oneElseAttribute',
)
oneElseAttribute = serializers.CharField(source='one_else_attribute', validators=[val1, val2])
def validate(self):
'''
Object level validation, must raise ValidationError on failure
'''
pass
`oneElseAttribute` при сериализации на вход будет порождать ключ `one_else_attribute`, а на выход - искать ключ/аттрибут отъекта (в зависимости от того, чем вы инстанциируете сериализатор) `one_else_attribute`, а в выходном json будет `oneElseAttribute`.
Когда вы вызовете is_valid() экземпляра этого сериализатора, он прогонит сначала определенные на модели валидаторы для полей `id` и `attribute`, затем ваши `val1` и `val2` для `one_else_attribute`, после чего запустит валидацию объекта, которую вы (возможно) опишете в методе `validate` сериализатора (или не запустит, если это partial_update объекта (HTTP PATCH), а после вызова `.is_valid` у вас будет доступным `.validated_data`, которая по сути OrderedDict с ключами, которые у вас определены на модели.
Это несколько отличается от того, чего хотите вы, вы исходите от действия, а рест фреймворк в первую очередь ориентируется на модель. Но реализовать можно и ваш подход, если несколько переопределить поведение рест_фреймворка.