我注意到 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']
我会强烈建议不要只检索所有字段并序列化它们。首先,这可能是一个“严重”的安全漏洞,因为在这种情况下您暴露了(“散列”)密码。但更重要的是,并非所有字段都可以归结为原始类型,例如 ForeignKey
s、ManyToManyField
s 等。