Django REST API followers system

Viewed 313

I'm trying to make a rest API for a blog app using Django-rest-framework. I'm a beginner and it's hard for me to understand how to implement that system. I made an intermediary model for making connections between followers and followings and serializers for users. But my API showing absolutely wrong following and followers for each user and endpoints for following and unfollowing not working also. https://github.com/romon267/blog_api - my code
Models.py:

class UserFollowing(models.Model):
    class Meta:
        constraints= [
        models.UniqueConstraint(fields=['user_id', 'following_user_id'], name='unique_following')
    ]
        ordering = ['-created']
    
    user_id = models.ForeignKey('auth.User', related_name='following', on_delete=models.SET_NULL, null=True,blank=True)
    following_user_id = models.ForeignKey('auth.User', related_name='followers', on_delete=models.SET_NULL, null=True,blank=True)
    created = models.DateTimeField(auto_now_add=True)


    def __str__(self):
    return f'{self.user_id} is following {self.following_user_id}'

serializers.py:

class UserSerializer(serializers.HyperlinkedModelSerializer):
following = serializers.HyperlinkedRelatedField(many=True, view_name='user-detail', read_only=True)
followers = serializers.HyperlinkedRelatedField(many=True, view_name='user-detail', read_only=True)
posts = serializers.HyperlinkedRelatedField(many=True, view_name='post-detail', read_only=True)

class Meta:
    model = User
    fields = ['url', 'id', 'username', 'posts', 'following', 'followers']


def get_following(self, obj):
    return FollowingSerializer(obj.following.all(), many=True).data

def get_followers(self, obj):
    return FollowersSerializer(obj.followers.all(), many=True).data

class UserFollowingSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserFollowing
        fields = '__all__'

class FollowingSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserFollowing
        fields = ['id', 'following_user_id', 'created']

class FollowersSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserFollowing
        fields = ['id', 'user_id', 'created']

views.py:

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    

class UserFollowingViewSet(viewsets.ModelViewSet):
    queryset = UserFollowing.objects.all()
    serializer_class = UserFollowingSerializer



class UserFollow(APIView):
    """
    Retrieve, update or delete a snippet instance.
    """
    def get_object(self, pk):
        try:
            return User.objects.get(pk=pk)
        except User.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

    def post(self, request, pk, format=None):
        user = request.user
        follow = self.get_object(pk)
        UserFollowing.objects.create(user_id=user.id, following_user_id = follow.id)
        serializer = UserSerializer(follow)
        return Response(serializer.data)

    def delete(self, request, pk, format=None):
        user = request.user
        follow = self.get_object(pk)
        UserFollowing.objects.delete(user_id=user.id, following_user_id = follow.id)
        serializer = UserSerializer(follow)
        return Response(serializer.data)
0 Answers
Related