django rest framework - how do you flatten nested data?

前端 未结 5 1219
眼角桃花
眼角桃花 2020-12-12 18:13

I have a \'through\' model governing a many to many relationship and i want to be able to return the \'through\' model and the target model as flat data, as opposed to havin

5条回答
  •  盖世英雄少女心
    2020-12-12 18:38

    I didn't try it with HyperlinkedModelSerializer but with ModelSerializer you can make custom serializer class that supports flatten option.

    class CustomModelSerializer(serializers.ModelSerializer):
        def __init__(self, *args, **kwargs):
            self.flatten = kwargs.pop('flatten', False)
            super(CustomModelSerializer, self).__init__(*args, **kwargs)
    
        def get_fields(self):
            fields = super(CustomModelSerializer, self).get_fields()
            for field_name, field in fields.items():
                if getattr(field, 'flatten', False):
                    del fields[field_name]
                    for nested_field_name, nested_field in field.fields.iteritems():
                        nested_field.source = (field_name + '.' +
                                               (nested_field.source or nested_field_name))
                        fields[nested_field_name] = nested_field
            return fields
    

    Usage:

    class MembershipSerializer(CustomModelSerializer):
        person = PersonSerializer(flatten=True)
    
        class Meta:
            model = Membership
            fields = ('person', ...)
    
    
    class PersonSerializer(CustomModelSerializer):
    
        class Meta:
            model = Person
            fields = (...)
    

提交回复
热议问题