Add extra property to this json response returned by Django rest framework

Question:

I am running django 4.0.6 with djangorestframework.

This is my serializers.py

from django.contrib.auth import get_user_model
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):  # new
    class Meta:
        model = get_user_model()
        fields = (
            "id",
            "username",
        )

This is my views.py

from django.contrib.auth import get_user_model
from rest_framework import generics

from .serializers import UserSerializer


class UserList(generics.ListCreateAPIView):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer

Here is the json response of the API;

{
    "count": 3,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "username": "test"
        },
        {
            "id": 4,
            "username": "test1"
        },
        {
            "id": 8,
            "username": "test3"
        }
    ]
}

I would like to add an extra property to this json response returned by Django rest framework such that it will look like this;

{
    "count": 3,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "username": "test"
            "combine" : "test 1"
        },
        {
            "id": 4,
            "username": "test1"
            "combine" : "test1 4"
        },
        {
            "id": 8,
            "username": "test3"
            "combine" : "test3 8"
        }
    ]
}

The extra property combine is created by concatenating id and username.

Asked By: user3848207

||

Answers:

You can use a SerializerMethodField:

class UserSerializer(serializers.ModelSerializer):
    combine = serializers.SerializerMethodField()

    class Meta:
        model = get_user_model()
        fields = (
            "id",
            "username",
            "combine",
        )

    def get_combine(self, obj):
        return f"{obj.username} {obj.id}"
Answered By: Marco