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