umarbeyoglu
umarbeyoglu

Reputation: 450

How to return articles from followed users only?

Right now i am successfully able to return every article without issue. But what i want to do is this: I want to return the articles,only followed by the current authenticated user. How can i do it?

models.py

class User(AbstractUser,PermissionsMixin):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.CharField(max_length=255,unique=True)
    username =models.CharField(max_length=80,unique=True,default='undefinedusername')
 
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    objects = UserManager()

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

class Article(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='articles')
    caption = models.CharField(max_length=250)

class UserFollow(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='following')
    profile = models.ForeignKey(User,on_delete=models.CASCADE,related_name='followers')

serializers.py

class UserSerializer(DynamicFieldsMixin,serializers.ModelSerializer):
    userfollowers_set = UserFollowSerializer(source='followers',required=False,many=True)
    userfollowing_set = UserFollowSerializer(source='following',required=False,many=True)
   
    class Meta:
        model = User
        fields  = ('id','email','username','userfollowing_set','userfollowers_set')

views.py

class ArticleViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = Article.objects.all().order_by('-timestamp')
    serializer_class = ArticleSerializer

Error 1:

    class FollowedAuthorFilterBackend(filters.BaseFilterBackend):
NameError: name 'filters' is not defined

Upvotes: 1

Views: 79

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476813

You can filter with:

class ArticleViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = Article.objects.all().order_by('-timestamp')
    serializer_class = ArticleSerializer

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            author__following__author=request.user
        )

We can also move the filtering logic into a FilterBackend:

class FollowedAuthorFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(
            author__following__profile=request.user
        )

Then we can plug in this FollowedAuthorFilterBackend where we want to filter this, so we can rewrite our ArticleViewSet to:

class ArticleViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = Article.objects.all().order_by('-timestamp')
    serializer_class = ArticleSerializer
    filter_backends = [FollowedAuthorFilterBackend]

    # no get_queryset

Upvotes: 2

Related Questions