【问题标题】:Django Rest Framework Serializer add elements to Meta.fieldsDjango Rest Framework Serializer 向 Meta.fields 添加元素
【发布时间】:2018-08-15 23:11:35
【问题描述】:

我创建了一个自定义序列化程序类,将答案复制到this question,但在此示例中,fields 参数替换了原始Meta.fields 属性,我想要的是添加 Meta.fields 的新元素。有什么办法可以做到吗?

这是我的序列化器:

class DynamicModelSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)
        add_fields = kwargs.pop('add_fields', None)
        exclude = kwargs.pop('exclude', None)
        nest = kwargs.pop('nest', None)

        if nest is not None:
            self.Meta.depth = nest

        super(DynamicModelSerializer, 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 exclude is not None:
            for field_name in exclude:
                self.fields.pop(field_name)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    是的,您可以这样做,如下更改您的 DynamicModelSerializer:

    class DynamicModelSerializer(serializers.ModelSerializer):
        def __init__(self, *args, **kwargs):
            fields = kwargs.pop('fields', None)
            add_fields = kwargs.pop('add_fields', None)
            exclude = kwargs.pop('exclude', None)
            nest = kwargs.pop('nest', None)
    
            if nest is not None:
                self.Meta.depth = nest
    
            super(DynamicModelSerializer, 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 add_fields is not None:
                for field_name, field_class in add_fields.items():
                    ### first pop the old field class from the fields if it's there
                    if field_name in self.fields:
                        self.fields.pop(field_name)
                    ### now add the field to the fields
                    self.fields[field_name] = field_class
    
    
            if exclude is not None:
                for field_name in exclude:
                    self.fields.pop(field_name)
    

    用法:

    class ExampleSerializer(DynamicModelSerializer):
        test1 = serializers.CharField()
    
        class Meta:
            model = Example
            fields = ('test1', 'test2', 'test3')
    
    
    ser = ExampleSerializer(fields=('test1', 'test3'), add_fields={'addField1': serializers.CharField()})
    

    【讨论】:

    • 太棒了!!非常感谢
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多