Как создать очень быструю замену сериализатора для Django ReadOnlyViewSet?
Я заметил, что сериализаторы Django работают крайне медленно даже после решения проблем с N+1 типом (я думаю). Я основываюсь на собственном опыте и вопросах, подобных этим
- ModelSerializer работает крайне медленно во фреймворке Django REST
- https://hakibenita.com/django-rest-framework-slow
В моем случае у меня есть модель для пользователей
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']
Я бы настоятельно не советовал просто извлекать все поля и сериализовать их. Прежде всего, это может быть серьезной уязвимостью безопасности, поскольку в этом случае вы раскрываете ( хэшированные) пароли. Но что более важно, не все поля сводятся к примитивным типам, например, с ForeignKey
s, ManyToManyField
s и т. д.