Search code examples
djangodjango-modelsdjango-rest-frameworkresponsedjango-serializer

How to make custom response in djangorestframework


So I like the idea of using class-based views and ModelSerializers but I have an issue with it for my particular use case. Maybe I am not using it as it's intended to be used.

class CarSerializer(serializers.ModelSerializer):

   class Meta:
        model = CarModel
        fields = ['car_name']


# A car can have build for multiple years
class MakelHistorySerializer(serializers.ModelSerializer):
   car = CarSerializer(many=True, read_only=True)

   class Meta:
        model = MakeHistoryModel
        fields = ['model_year', 'car']

The response is:

{
  "car": {
           "car_name": "Fiesta"
   },
   "model_year": "2020"
}

My two model classes, CarModel and MakeHistoryModel have ["id", "car_name", "manufacturer"] and ["id", "car_id", "model_year", "country_id"] fields respectively.

What kind of a response I really want is:

{
  "car_name": "Fiesta",
  "model_year": "2020"
}

How would I do this?


Solution

  • You don't need to first serializer (CarSerializer).Just this serializer which has SerializerMethodField enough for your output:

    class MakelHistorySerializer(serializers.ModelSerializer):
       car_name = serializers.SerializerMethodField()
    
       class Meta:
            model = MakeHistoryModel
            fields = ['model_year', 'car_name']
    
       def get_car_name(self,obj):
           return obj.car.name if obj.car_id else ''
           # I don't know your model so to avoid NoneType error, I added this check