Django rest framework: serializer does not include id field in response data

Viewed 1147

I am learning Django rest framework and have created the following serializer:

class EventCreateSerializer(serializers.ModelSerializer):
organiser = serializers.StringRelatedField(read_only=True, default=serializers.CurrentUserDefault())

class Meta:
    model = Event
    fields = ['id', 'name', 'description', 'date', 'organiser']

def save(self, **kwargs):
    name = self.validated_data['name']
    description = self.validated_data['description']
    date = self.validated_data['date']
    organiser = self.data['organiser']
    organiser_account = Account.objects.get(username=organiser)

    if not organiser_account:
        raise serializers.ValidationError('Error setting the organiser field')

    event = Event.objects.create(name=name, description=description, date=date, organiser=organiser_account)
    event.save()
    return event

Notice how 'id' is included as a field.

Now I have the following view:

class EventCreateView(APIView):
permission_classes = [IsAuthenticated]

def post(self, request, format=None):
    context = {
        'request': self.request
    }
    serializer = EventCreateSerializer(data=request.data, context=context)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data,
                        status=status.HTTP_201_CREATED)

    return Response({'fail': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

So when I make a post request to the appropriate url, I get back a response that include serializer.data. However, this does not contain the 'id' field (but it does contain the other fields).

The model used has an automatically generated id field.

I want the response to include the id field, how can I achieve this?

1 Answers

You are creating an Event instance by doing serializer.save() . Later you are returning the response. Here serializer.data won't include the id of the instance created because you have invoked def save(self, **kwargs) function, which just returns those fields which were used while creating an instance (meaning id isn't used and is auto generated).

Instead, you can save the instance when you use save(), like below: instance = serializer.save()

later save the serializer data in a variable: response_data = serializer.data

and now add the id field: response_data['id'] = instance.id

and return response_data

Related