簡體   English   中英

Django Rest Framework序列化器將元素添加到Meta.fields

[英]Django Rest Framework Serializer add elements to Meta.fields

我有一個自定義的序列化程序類,是通過復制此問題的答案而創建的,但是在此示例中, 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)

是的,您可以這樣做,如下所示更改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()})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM