祖传序列化

动态字段&动态只读的序列化

DynamicFieldsModelSerializer是祖传的,当view中需要动态设定字段时,或者设定只读字段时使用。

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)
        read_only_fields = kwargs.pop('read_only_fields', None)
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
        if fields is not None:
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)
        if read_only_fields is not None:
            for field_name in read_only_fields:
                self.fields[field_name].read_only = True

class UserSerializer(DynamicFieldsModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class UserView(generics.RetrieveUpdateAPIView):
    serializer_class = UserSerializer
    permission_classes = (IsSuperUser, )
    queryset = User.objects.filter(god=False)

    def get_serializer(self, *args, **kwargs):
        kwargs['fields'] = ('username', 'email')
        # 更新时不允许修改username
        kwargs['read_only_fields'] = ('username', )
        return super(UserChangeView, self).get_serializer(*args, **kwargs)

尽量少使用serializers.SerializerMethodField

如果使用其的字段又查询了其他表。当view是list的时候慎用。

如果每页有10个元素,则需要查询11次。如果有2个SerializerMethodField则需要查询21次。

如果非得要使用,请在view中的get_queryset中使用

select_related prefetch_related

posted @ 2019-12-31 15:51  久末丶  阅读(198)  评论(0编辑  收藏  举报