Imagine I asked you to build an API endpoint with name and id fields that looked like the following.

{
    "name": "William Vincent",
    "id": "v1.0-2018"
}

Do you see the issue? Using id is a problem since Django sets id to the primary key of a database entry by default, yet we need to output id representing a different value somehow. The answer is to use the source argument in Django Rest Framework’s serializer class.

Here’s what the models.py and serializers.py files would look like.

# models.py
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    person_id = models.CharField(max_length=100)


# serializers.py
from rest_framework import serializers
from . import models


class PersonSerializer(serializers.ModelSerializer):
    id = serializers.CharField(source='person_id')

    class Meta:
        model = models.Person
        fields = ('name', 'id',)

So the next time you need to override the outputted field name on a model, think first of your serializer and then of source.


I am writing a book called REST APIs with Django. To be notified when it is available as well as to receive special discounts, please sign up for my newsletter below.