如何为 Django ReadOnlyViewSet 创建非常快的序列化器替换?

问题描述 投票:0回答:1

我注意到 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
,并且它会跳过验证等。我希望因为它是只读验证也没有多大意义,但也许我错过了一些东西。

django django-serializer
1个回答
0
投票

您可以覆盖

.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 等。

    

© www.soinside.com 2019 - 2024. All rights reserved.