How to serialize extra fields. Django-Rest-Framework

Question:

I am trying to return extra data for the "following_user" but I’m getting returned the data for the "user" instance

The View to get Users following list:

class UsersFollowing(generics.ListAPIView):
    authentication_class = [authentication.TokenAuthentication]
    permission_class = [permissions.IsAuthenticated]
    serializer_class = FollowingSerializer

    def get_queryset(self):
        user = self.request.GET.get('user_id')
        obj = Follow.objects.filter(user=user)

        return obj

the Serializer:

class FollowingSerializer(serializers.ModelSerializer):
    avi_pic = serializers.SerializerMethodField('get_avi_pic')
    username = serializers.SerializerMethodField('get_username')
    first_name = serializers.SerializerMethodField('get_first_name')
    last_name = serializers.SerializerMethodField('get_last_name')

    def get_username(self, obj):
        username = obj.following_user.username
        return username
    
    def get_first_name(self, obj):
        first_name = obj.following_user.first_name
        return first_name
    
    def get_last_name(self, obj):
        last_name = obj.following_user.last_name
        return last_name

    class Meta:
        model = Follow
        fields = "__all__"

my Follow model:

class Follow(models.Model):
    user = models.ForeignKey(
        "User", related_name="follower", on_delete=models.CASCADE)
    following_user = models.ForeignKey(
        "User", related_name="following", blank=True, on_delete=models.CASCADE)
    date_followed = models.DateTimeField(auto_now_add=True)

My User model:

class User(AbstractUser):
    objects = UserManager()
    avi_pic = models.ImageField(
        _('avi_pic'), upload_to=aviFile, null=True, blank=True)
    email = models.EmailField(max_length=250, unique=True)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    username = models.CharField(max_length=60, unique=True)
Asked By: jdez

||

Answers:

I think your naming of foreign key fields is not good. It is often better not to add the trailing the word id. Then the Django ORM will automatically adds the field named user_id.

class Follow(models.Model):
    user = models.ForeignKey(
        "User", related_name="follower", on_delete=models.CASCADE)
    following_user = models.ForeignKey(
        "User", related_name="following", blank=True, on_delete=models.CASCADE)
    date_followed = models.DateTimeField(auto_now_add=True)

And then in the serializer, you could set the serializer of the User model.

class FollowingSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only = True)
    following_user = UserSerializer(read_only = True)

    class Meta:
        model = Follow
        fields = "__all__"
Answered By: Metalgear