Changing serializer fields on the fly

后端 未结 4 1500
别跟我提以往
别跟我提以往 2020-12-11 03:14

For example I have the following serializer:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = (
             


        
4条回答
  •  南笙
    南笙 (楼主)
    2020-12-11 03:40

    this should be what you need. I used a function view but you can use class View or ViewSet (override get_serializer_class) if you prefer.

    Note that serializer_factory also accept exclude= but, for security reason, I prefer use fields=

    serializer_factory create a Serializer class on the fly using an existing Serializer as base (same as django modelform_factory)

    ==============

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = (
               'userid',
               'password'
            )
    
    
    @api_view(['GET', 'POST'])
    def user_list(request):
        User = get_user_model()
    
        if request.method == 'GET':
            fields=['userid']
        elif request.method == 'POST':
            fields = None
        serializer = serializer_factory(User, UserSerializer, fields=fields)
        return Response(serializer.data)
    
    def serializer_factory(model, base=HyperlinkedModelSerializer,
                           fields=None, exclude=None):
        attrs = {'model': model}
        if fields is not None:
            attrs['fields'] = fields
        if exclude is not None:
            attrs['exclude'] = exclude
    
        parent = (object,)
        if hasattr(base, 'Meta'):
            parent = (base.Meta, object)
        Meta = type(str('Meta'), parent, attrs)
        if model:
            class_name = model.__name__ + 'Serializer'
        else:
            class_name = 'Serializer'
        return type(base)(class_name, (base,), {'Meta': Meta, })
    

提交回复
热议问题