'Providing custom field in serializer using model data

In Problem model I'm storing a list of users who have done it. In Problem serializer when user will request his data I want to show him if he has done certain problem. So I created custom field in serializer class and want to fill it using models data.

this is what I have done.

from rest_framework import serializers
from dsa.models import Problem

class ProblemSerializer(serializers.ModelSerializer):
    isDoneByUser = serializers.BooleanField(default=False)
    class Meta:
        model = Problem
        fields = ['id', 'topic', 'title', 'link', 'isDoneByUser']

    def perform_create(self, serializer):
        user = self.request.user
        userlist = serializer.data.get('isDone')
        print(userlist)

        if user in userlist:
            self.isDoneByUser = True

here is the model

from django.db import models
from django.contrib.auth.models import User

class Problem(models.Model):
    topic = models.CharField(max_length=100)
    title = models.CharField(max_length=100)
    link = models.URLField()
    isDone = models.ManyToManyField(User)

    class Meta:
        ordering = ['topic']

But this always setting isDoneByUser = False(default value)

please help!



Solution 1:[1]

You cannot set isDoneByUser to True as it does not exist in your model.

You can however get the boolean with a SerializerMethodField:

class ProblemSerializer(serializers.ModelSerializer):
    isDoneByUser = serializers.SerializerMethodField()

    def get_isDoneByUser(self, instance):
        user = self.context['request'].user
        return instance.isDone.filter(pk=user.pk).exists()

    class Meta:
        model = Problem
        fields = ['id', 'topic', 'title', 'link', 'isDoneByUser']

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ThomasGth