Как вернуть статьи только от пользователей, за которыми следят?

Прямо сейчас я успешно могу вернуть каждую статью без проблем. Но я хочу сделать следующее: Я хочу возвращать статьи, за которыми следовал только текущий аутентифицированный пользователь. Как я могу это сделать?

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

Вы можете фильтровать с помощью:

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
        )

Мы также можем переместить логику фильтрации в FilterBackend:

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

Затем мы можем подключить этот FollowedAuthorFilterBackend, где мы хотим фильтровать это, так что мы можем переписать наш ArticleViewSet на:

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

    # no get_queryset
Вернуться на верх