Как создать очень быструю замену сериализатора для Django ReadOnlyViewSet?

Я заметил, что сериализаторы Django работают крайне медленно даже после решения проблем с N+1 типом (я думаю). Я основываюсь на собственном опыте и вопросах, подобных этим

В моем случае у меня есть модель для пользователей

from django.contrib.auth.models
from rest_framework.viewsets import ReadOnlyModelViewSet

class UserViewSet(ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filterset_fields = {'groups__name': ['exact', 'in']

Если у меня есть функция вида:

def serialize_user(user_instance):
    return {f: getattr(user_instance, f) for f in user_instance._meta.fields}

Как мне написать пользовательский класс сериализатора, чтобы я мог использовать его как serializer_class = MyUserSerializer и он пропускал валидацию и т.д. Я полагаю, что поскольку валидация доступна только для чтения, она также не имеет особого смысла, но, возможно, я что-то упускаю.

Вы можете переопределить .to_represeentation(…) [drf-doc] для сериализации данных к «примитивному» представлению, так:

from rest_framework.serializers import BaseSerializer


class SimpleReadonlySerializer(BaseSerializer):
    def to_representation(self, instance):
        return {field: getattr(instance, field) for field in self.Meta.fields}

и, таким образом, работать с:

class MyUserSerializer(SimpleReadonlySerializer):
    class Meta:
        fields = ['username', 'email']

Я бы настоятельно не советовал просто извлекать все поля и сериализовать их. Прежде всего, это может быть серьезной уязвимостью безопасности, поскольку в этом случае вы раскрываете ( хэшированные) пароли. Но что более важно, не все поля сводятся к примитивным типам, например, с ForeignKeys, ManyToManyFields и т. д.

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