1

I am creating sample-api which have posts and followers. Post should visible to followers only

My models.py

from django.contrib.auth.models import User

class Post(models.Model):
    creator = models.ForeignKey(User, related_name='creator_post_set', null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=25)
    created_date = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    likes = models.BigIntegerField(null=True)
    comments = models.BigIntegerField(null=True)

class Follow(models.Model):
    follower = models.ForeignKey(User, related_name='following', null=True, on_delete=models.CASCADE)
    followed_on = models.DateTimeField(auto_now_add=True)
    following = models.ForeignKey(User, related_name='follower',null=True, on_delete=models.CASCADE) 

My serializers.py for the models:

class UserSerializer(ModelSerializer):
    password = serializers.CharField(write_only=True)
    def create(self, validated_data):
        user = User.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
        )
        return user

    class Meta:
        model = User
        fields = ('password', 'username', 'first_name', 'last_name',)

class PostListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'content', 'created_date',]

 class FollowSerializer(serializers.ModelSerializer):
    class Meta:
        model = Follow
        fields = '__all__'

My views.py:

    class PostList(generics.ListCreateAPIView):
            serializer_class = PostListSerializer
            follow_model = FollowSerializer.Meta.model
            post_model = PostSerializer.Meta.model

            def get_queryset(self):
                try:
                    followers = self.follow_model.objects.get(follower_id = 
 self.request.user.id) 
                    queryset = self.post_model.objects.get(creator__in = followers)
                except self.follow_model.DoesNotExist:
                    queryset = None
                return queryset

When I call this view it returns the following error:

Cannot query "Follow object (1)": Must be "User" instance.

I need help Thanks in Advance.

6
  • can you add the full traceback? Commented Apr 23, 2019 at 2:13
  • @JPG I updated the error traceback Commented Apr 23, 2019 at 2:19
  • this isn't the full version of traceback....pls add the whole traceback Commented Apr 23, 2019 at 2:20
  • I need the code for your serializers so I can replicate the problem Commented Apr 23, 2019 at 2:39
  • @HuLuViCa I included the serializers as well Commented Apr 23, 2019 at 2:55

1 Answer 1

2

As I can see, Post model's creator is FKed to User model. So you need to query using User model instance, not Follower model.

You can use the following code:

following = self.request.user.following.all().values_list('follower', flat=True)  # because of related name
queryset = self.post_model.objects.filter(creator_id__in = list(following))  

Here I have first retrieved the user ids using self.request.following.all() by reverse relationship. Then I have extracted the user ids using values_list. After that, I have used it in Post.objects.filter(...) method.

Sign up to request clarification or add additional context in comments.

3 Comments

I used the above code it returns post Post matching query does not exist.
Maybe I queried with wrong values. Can you please try with valurs_list('follower', flat=True)?
thanks @ruddra it works inspite of using get I am using filter(Post.bojects.filter())

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.