Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

242
Views
is it possible to dynamically change field name within django-rest-framework serializer?

I have Product and ProductCategory models.

Let's say I have ProductCategory TV, which has Sony, Samsung as its products. I also have MobilePhone category with Apple and Nokia as its products. Using DRF, I would like to get JSON output using serializers, which is similar to the below:

{
    'TV': 
        [
            'Sony': 
                {
                    'price': '$100',
                    'country': 'Japan',
                },
            'Samsung': 
                {
                    'price': '$110',
                    'country': 'Korea',
                }
        ]

    'mobile_phone':
        [
            'Apple': 
                {
                    'price': '$300',
                    'country': 'USA',
                },
            'Nokia': 
                {
                    'price': '$210',
                    'country': 'Finland',
                }
        ]
}

The problem here is that the field names('TV', 'mobile_phone') in serializer have to be dynamic.

I know I can get the following JSON type

{ 
    [
            {   
                'product_category': 'TV',
                'manufacturer: 'Sony',
                'price': '$100',
                'country': 'Japan',
            },
            {
                'product_category': 'TV',
                'manufacturer: 'Samgsung',
                'price': '$110',
                'country': 'Korea',
            }
    ]

    [
            {
                'product_category': 'mobile_phone',
                'manufacturer: 'Samgsung',
                'price': '$300',
                'country': 'USA',
            },
            {
                'product_category': 'mobile_phone',
                'manufacturer: 'Apple',
                'price': '$210',
                'country': 'Finland',
            }
    ]
}

with

class CategorySerializer(serializers.Serializer):
    product_category = serializer.CharField()
    manufacturer = serializer.CharField()
    price = serializer.CharField()
    country = serializer.CharField()

But the dynamically-changing-field-names is difficult to achieve. Is there any way I can do this?

about 4 years ago · Santiago Trujillo
1 answers
Answer question

0

You can support this kind of custom format by overriding to_representation of your Serializer and of the default ListSerializer:

  1. First, you override to_representation of your serializer:

    class CategorySerializer(serializers.Serializer):
        # your fields here
    
        def to_representation(self, obj):
          return {
              obj.manufacturer: {
                 'price': obj.price,
                 'country': obj.country
              }
          }
    

    So that your serialized categories are of this form:

    {
        'Sony': {
          'price': '$100',
          'country': 'Japan'
        }
    }
    
  2. Then to prepend the product_category in front of your list, you can use a custom ListSerializer with a custom to_representation:

    class CategoryListSerializer(serializers.ListSerializer):
    
        def to_representation(self, data):
            # Group your data entries by category here
            ...
            return {
                'TV': tv_data
                'mobile_phone': mobile_data
            }
    
    class CategorySerializer(serializers.Serializer):
        ...
        class Meta:
          list_serializer_class = CategoryListSerializer
    
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!