【问题标题】:How to return articles from followed users only?如何仅从关注的用户返回文章?
【发布时间】:2021-08-09 02:45:12
【问题描述】:

现在我可以成功地退回每篇文章而没有问题。 但我想做的是: 我想返回文章,后面只有当前经过身份验证的用户。我该怎么做?

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

错误 1:

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以使用以下方式过滤:

    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

    【讨论】:

    • 如何使用 request.user ?我使用 django 作为移动应用程序的 API,我可以发出 POST 请求来填充 request.user 吗?
    • @umarbeyoglu:您将需要指定如何对用户进行身份验证,例如使用 JWT 令牌:django-rest-framework.org/api-guide/authentication,或者通过某些视图使用凭据发出 POST 请求并检索令牌。
    • 非常感谢,我会尝试并尽快回复(如果正确,请勾选答案)。
    • 为了进一步通知,我建议def filter_queryset(self, request, queryset, view): return queryset.filter( author__following__profile=request.user ) 应该编辑为def filter_queryset(self, request, queryset, view): return queryset.filter( author__following__author=request.user ),因为作者是关注者,个人资料是关注者并且是用户本身
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多