Django Rest framework, how to include '__all__' fields and a related field in ModelSerializer ?

前端 未结 7 2065
Happy的楠姐
Happy的楠姐 2020-12-01 05:09

I have two models, one with M2M relation and a related name. I want to include all fields in the serializer and the related field.

models.py:

<
7条回答
  •  庸人自扰
    2020-12-01 06:00

    Like @DanEEStart said, DjangoRestFramework don't have a simple way to extend the 'all' value for fields, because the get_field_names methods seems to be designed to work that way.

    But fortunately you can override this method to allow a simple way to include all fields and relations without enumerate a tons of fields.

    I override this method like this:

    class ToppingSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Topping
            fields = '__all__'
            extra_fields = ['pizzas']
    
        def get_field_names(self, declared_fields, info):
            expanded_fields = super(ToppingSerializer, self).get_field_names(declared_fields, info)
    
            if getattr(self.Meta, 'extra_fields', None):
                return expanded_fields + self.Meta.extra_fields
            else:
                return expanded_fields
    

    Note that this method only change the behaviour of this serializer, and the extra_fields attribute only works on this serializer class.

    If you have a tons of serializer like this, you can create a intermediate class to include this get_fields_names method in one place and reuse'em many times. Some like this:

    class CustomSerializer(serializers.HyperlinkedModelSerializer):
    
        def get_field_names(self, declared_fields, info):
            expanded_fields = super(CustomSerializer, self).get_field_names(declared_fields, info)
    
            if getattr(self.Meta, 'extra_fields', None):
                return expanded_fields + self.Meta.extra_fields
            else:
                return expanded_fields
    
    
    class ToppingSerializer(CustomSerializer):
    
        class Meta:
            model = Topping
            fields = '__all__'
            extra_fields = ['pizzas']
    
    class AnotherSerializer(CustomSerializer):
    
        class Meta:
            model = Post
            fields = '__all__'
            extra_fields = ['comments']
    

提交回复
热议问题